一直以來都理解錯了,不是使用條件變數再加上一對互斥鎖,而是條件變數內部引入乙個互斥鎖,其實主要還是條件變數在起作用,這樣會提高效率,看下面的例子。
while(true)
//thread 2:
while(true)
pthread_mutex_unlock(&mutex);
}
這種實現下,就算 lock 空閒,thread2需要不斷重複《加鎖,判斷,解鎖》這個流程,會給系統帶來不必要的開銷。有沒有一種辦法讓 thread2先被 block,等條件滿足的時候再喚醒 thread2?這樣 thread2 就不用不斷進行重複的加解鎖操作了?(現在只是互斥,想要實現乙個同步)這就要用到條件變數了:
//thread1 :
while(true)
pthread_mutex_unlock(&mutex);
}//thread2:
while(1)
printf("icount >= 100\r\n");
icount = 0;
pthread_mutex_unlock(&mutex);
}
需要注意的是,條件變數需要配合互斥鎖來使用:
為什麼要與pthread_mutex 一起使用呢? 這是為了應對 執行緒1在呼叫pthread_cond_wait()但執行緒1還沒有進入wait cond的狀態的時候,此時執行緒2呼叫了 cond_singal 的情況。 如果不用mutex鎖的話,這個cond_singal就丟失了。如果等待時,條件不滿足,那麼就放鎖,這樣另乙個執行緒就會拿到這個鎖,繼續執行,只有滿足條件時,才會加鎖。加了鎖的情況是,執行緒2必須等到 mutex 被釋放(也就是 pthread_cod_wait() 釋放鎖並進入wait_cond狀態 ,此時執行緒2上鎖) 的時候才能呼叫cond_singal.
簡而言之就是,在thread 1 call pthread_cond_wait() 的時刻到 thread 1真正進入 wait 狀態時,是存在著時間差的。如果在這段時間差內 thread2 呼叫了 pthread_cond_signal() 那這個 signal 訊號就丟失了。給 wait 加鎖可以防止同時有另乙個執行緒在 signal。
使得效率變高是其一,
另外使用條件變數,避免了死鎖的發生:
互斥鎖和條件變數
互斥瑣 定義 指代相互排斥,最基本的同步形式。用於保護臨界區,以保證任何時刻只有乙個執行緒或乙個程序在執行其中的 上鎖 pthread mutex lock 臨界區解鎖 pthread mutex unlock 條件變數 定義 用於等待訊號,同步的另一種手段。每乙個條件變數總有乙個互斥瑣與之關聯。等...
互斥鎖和條件變數
mutex體現的是一種競爭,我離開了,通知你進來。cond體現的是一種協作,我準備好了,通知你開始吧。互斥鎖乙個明顯的缺點是它只有兩種狀態 鎖定和非鎖定。而條件變數通過允許執行緒阻塞和等待另乙個執行緒傳送訊號的方法彌補了互斥鎖的不足,它常和互斥鎖一起配合使用。使用時,條件變數被用來阻塞乙個執行緒,當...
互斥鎖和條件變數
條件變數 執行緒最大的特點就是資源的共享性,然而資源共享中的同步問題是多執行緒程式設計的難點。互斥鎖通過鎖機制來實現執行緒間的同步。使用互斥鎖前必須進行初始化操作。初始化有兩種方式 一種是靜態賦值法,將將巨集結構常量pthread mutex initializer賦給互斥鎖,操作語句如下 pthr...