首先我們我覺得有必要再加深一下對於條件變量的理解,
以及對信號量的理解。
好,瞭解之後切入正題,條件變量和信號量是各有千秋的,雖然大方向上都是爲了實現線程同步,但是實現過程是有一定差異的。
條件變量的優勢:要實現屏障同步,您將不能使用信號量。但條件變量是理想的。
/*
屏障同步是指您希望所有線程都等待,直到每個線程都到達線程函數的某個部分。
這可以通過一個靜態變量來實現,該靜態變量最初是每個線程到達該屏障時遞減的總線程的值。
這意味着我們希望每個線程都休眠,直到最後一個線程到達。
信號量的作用正好相反,使用信號量時,每個線程將繼續運行,最後一個線程(將信號量值設置爲0)將進入睡眠狀態。
*/
條件變量需要和互斥鎖搭配使用,條件變量的廣播功能是信號量所不具備的。
信號量的優勢:
信號量可以實現互斥量,大部分情況下也可以實現條件變量。甚至使用信號量的實現遠比其他實現更容易理解。然而很多時候使用信號量替換條件變量的可能會降低併發程序的性能。
不過, 信號量除了可以作爲二值計數器用於模擬線程鎖和條件變量之外, 還有比它們更加強大的功能, 信號量可以用做資源計數器,
也就是說初始化信號量的值爲某個資源當前可用的數量, 使用了一個之後遞減, 歸還了一個之後遞增
信號量與線程鎖,條件變量相比還有以下幾點不同:
1)鎖必須是同一個線程獲取以及釋放, 否則會死鎖.而條件變量和信號量則不必.
2)信號的遞增與減少會被系統自動記住, 系統內部有一個計數器實現信號量,不必擔心會丟失, 而喚醒一個條件變量時,如果沒有相應的線程在等待該條件變量, 這次喚醒將被丟失.
個人感覺,建議使用條件變量。
這是我的條件變量封裝。
提取碼:c43u