一、互斥鎖
1、概念: 實現執行緒訪問臨界資源的同步控制。 如果乙個執行緒在臨界區開始時,給互斥鎖加鎖, 那麼其他的執行緒就必須等待執行緒解鎖, 才能接著執行, 並訪問資源。
操作: ①初始化, ②加鎖,③ 解鎖,④ 銷毀鎖
2、互斥鎖型別
: pthread_mutex_t
3、鎖初始化:
int pthread_mutex_init(pthread_mutex_t*mutex,pthread_mutexattr_t *attr);
4、加鎖:
int pthread_mutex_lock(pthread_mutex_t *mutex);
5、解鎖:
int pthread_mutex_unlock(pthread_mutex_t *mutex);
6、銷毀鎖:
int pthread_mutex_destroy(pthread_mutex_t *mutex)
7、總結:當兩個執行緒要訪問同乙個資源時,乙個執行緒占用後會給該資源加鎖使得其它執行緒無法訪問,當它使用完時,再將該資源解鎖,讓其他執行緒使用。加鎖後必須要解鎖,而且執行緒不能隨便加鎖,只有該資源是解鎖狀態才能加鎖。
二、訊號量
1、概念:訊號量就相當於乙個標誌,開始時是0,p操作將訊號量減1,v操作是將訊號量加1。如果訊號量是0時,去執行p操作,執行緒就會阻塞,只有當訊號量大於0時才能夠實行p操作。
函式: #include 「semaphore.h」
2、初始化:int sem_init(sem_t *sem, int pshared, int val);
①pshared控制訊號量的型別,當傳遞為0時,表示這個訊號量只能在這個程序中使用,非0時可以在多個程序間共享。目前linux不支援非0。
3、p操作:int sem_wait(sem_t *sem); –》-1
4、v操作:int sem_post(sem_t *sem); –》 +1
5、銷毀:int sem_destroy(sem_t *sem);
6、總結:在資源同步中,當,兩個執行緒要使用乙個資源時,有乙個要先使用,我們可以將這個執行緒進行v操作,另乙個執行緒進行p操作。如果第乙個執行緒還沒使用這個資源,那麼在執行第二個執行緒時由於訊號量是0,執行p操作是會阻塞,直到第乙個執行緒進行v操作,將訊號量變為1。這樣就實現了執行緒的同步控制。
同步控制 condition variable
條件變數 condition variable 用來實現多執行緒間的同步操作,控制多個執行緒的執行順序。操作作用 conditon variable cv 預設建構函式 conditon variable 析構函式 cv.notify one 喚醒乙個等待執行緒,若沒有等待執行緒,通知則被丟棄。cv...
linux中的同步方法
自旋鎖最多只能被乙個可執行執行緒持有,如果乙個執行執行緒試圖獲得乙個已經被持有的自旋鎖,那麼該執行緒就會一直進行迴圈 旋轉 等待鎖重新可用。乙個被爭用的自旋鎖使得請求它的執行緒在等待鎖重新可用時自旋,這樣就特別浪費處理器時間,所以自旋鎖不應該被長時間持有,相比於互斥鎖,互斥鎖會讓執行緒阻塞,被阻塞的...
Linux中的同步互斥
生活中的例子 洗菜必須在買菜之後,做菜必須在洗菜之後,吃飯必須在做菜之後.軟體上的概念 指的是散落在不同執行緒 程序中的 片段,他們的執行順序必須是有序,因為b 片段的執行依賴著a 片段的結果,同理c 片段的執行依賴著b 片段的結果.那麼,怎麼實現abc的有序執行呢?這就是同步的任務.同步用於保證這...