條件變數(三)

2022-08-16 00:30:21 字數 955 閱讀 7161

條件變數(二)這邊文章主要糾結了pthread_cond_wait(&cond,&mutex)函式以及為何判斷條件時要用while而不是if。

1、先改變條件值還是先呼叫pthread_cond_signal?

2、pthread_cond_signal寫在臨界區內還是臨界區外?

其實都一樣,因為已經持有鎖了。在沒有鎖的情況下改變條件本來就很危險。當然可以在沒有鎖的情況下呼叫signal或者broadcast函式。

1

void

signal()

2

這個問題本人在github上請教過陳碩大神,見在持有鎖的情況下,沒有其他執行緒可以從wait返回,因為阻塞在mutex_lock佇列中,在等待鎖,因為wait出來後要加鎖:

1

void

broadcast()

2

這兩種寫法都見到過,也都正確,但各有缺點。

一、在臨界區內呼叫pthread_cond_signal:

1

void

signal()

2

缺點是執行緒a的signal喚醒另外乙個執行緒b的wait時,wait要加鎖,此時互斥鎖有可能仍然被執行緒a持有,導致執行緒b再次陷入核心,影響效能。但是在linuxthreads或者nptl裡面,就不會有這個問題,因為在linux 執行緒中,有兩個佇列,分別是cond_wait佇列和mutex_lock佇列, cond_signal只是讓執行緒從cond_wait佇列移到mutex_lock佇列,而不用返回到使用者空間,不會有效能的損耗。操。那討論個蛋。(思考:執行緒a最後釋放的鎖一定會被執行緒b得到嗎?就不會被別的執行緒得到?若不能保證b等到a釋放的鎖,豈不是一次虛假喚醒?)

二、在臨界區外呼叫pthread_cond_signal:

1

void

signal()

2

條件變數 pthread cond init

include int pthread cond init pthread cond t cv,const pthread condattr t cattr 返回值 函式成功返回0 任何其他返回值都表示錯誤初始化乙個條件變數。當引數cattr為空指標時,函式建立的是乙個預設的條件變數。否則條件變數的...

條件變數 pthread cond init

include int pthread cond init pthread cond t cv,const pthread condattr t cattr 返回值 函式成功返回0 任何其他返回值都表示錯誤初始化乙個條件變數。當引數cattr為空指標時,函式建立的是乙個預設的條件變數。否則條件變數的...

pthread cond t條件變數

條件變數是利用執行緒間共享的全域性變數進行同步的一種機制,主要包括兩個動作 乙個執行緒等待 條件變數的條件成立 而掛起 另乙個執行緒使 條件成立 給出條件成立訊號 為了防止競爭,條件變數的使用總是和乙個互斥鎖結合在一起。一 pthread cond wait定義 函式原型 int pthread c...