1. 程式人生 > 其它 >鎖和訊號量的理解

鎖和訊號量的理解

技術標籤: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