鎖和訊號量的理解
阿新 • • 發佈:2021-01-20
技術標籤:Linux技術
相同點:
- 都是用於訪問臨界區
差異:
- 鎖:
pthread_mutex_init();
pthread_mutex_destroy();
pthread_mutex_lock();
pthread_mutex_trylock();//輪詢方式加鎖
pthread_mutex_unlock();
非0即1的方式訪問臨界區,只能是獲得鎖的物件才能訪問臨界區,進入臨界區之前pthread_mutex_lock,其他物件就無法進去臨界區,只有等待獲取鎖的物件pthread_mutex_unlock出了臨界區之後,其他物件才能獲取鎖進入臨界區。
注意點:有時候有些老版本的Linux裝置,如果有一個物件經常獲取不到鎖,沒法進入臨界區,有可能會導致該物件的執行緒優先順序被降低,導致更難獲取鎖。
- 訊號量:
sem_init()
sem_destroy()
sem_wait()
sem_post()
post相當於+1, wait的時候,只有訊號量的值大於1時,才能得到訊號,要不然就阻塞再wait那裡。
如: A -> post, B -> Post 然後wait可以得到兩次訊號量,第三次就阻塞再wait處。
PS:
GCC提供了原子操作方法:__sync_add_and_fetch等。
C++11也支援原子操作資料型別如std::atomic_int