簡單來說,就是訊號量太容易出錯了(too error prone),通過組合互斥鎖(mutex)和條件變數(condition variable)可以達到相同的效果,且更加安全。實現如下:
class semaphore
void
signal
() void
wait
());
--count_;
}private:
boost::mutex mutex_;
boost::condition_variable cv_;
long count_;
};
下面建立三個工作執行緒(worker),來測試這個訊號量。
int
main
() threads.join_all();
return
0;}
每個工作執行緒先等待訊號量,然後輸出執行緒 id 和當前時間,輸出操作以互斥鎖同步以防止錯位,睡眠一秒是為了模擬線程處理資料的耗時。
void
worker
() // sleep 1 second to simulate data processing.
boost::this_thread::sleep(boost::posix_time::seconds(1));
g_semaphore.signal();
}
訊號量本身是乙個全域性物件,count
為1
,一次只允許乙個執行緒訪問:
semaphore g_semaphore
(1);
輸出為:
thread 1d38: wait
succeeded (13:10
:10)
thread 20f4: wait
succeeded (13:10
:11)
thread 2348: wait
succeeded (13:10
:12)
可見每個執行緒相隔一秒,即一次只允許乙個執行緒訪問。如果把count
改為3
:
semaphore g_semaphore
(3);
那麼三個執行緒輸出的時間應該一樣:
thread 19f8: wait
succeeded (13:10
:57)
thread 2030: wait
succeeded (13:10
:57)
thread 199c: wait
succeeded (13:10
:57)
最後附上formattime
函式的實現:
std::string
formattime
(boost::posix_time::ptime& time, const
char* format)
作業系統 訊號量vs互斥鎖c 11訊號量實現
鎖是服務於共享資源的 而semaphore多用於控制多個執行緒間的執行順序的。1 兩個執行緒交替列印0,1 c 11中有 mutex 互斥量 有 condition variable 條件變數 並沒有 semaphore 訊號量 需要自己實現。版本1 自己實現的訊號量類。無非就是讓p v操作,即 減...
C 11 實現訊號量(吃水果問題)
自 c 11中有互斥和條件變數但是並沒有訊號量,但是利用互斥和條件變數很容易就能實現訊號量。訊號量是乙個整數 count,提供兩個原子 atom,不可分割 操作 p 操作和 v 操作,或是說 wait 和 signal 操作。吃水果問題 桌子有乙隻盤子,只允許放乙個水果,父親專向盤子放蘋果,母親專向...
C 11 互斥鎖與條件變數實現訊號量
include include include includeusing namespace std class semaphere semaphere const semaphere s delete semaphere operator const semaphere s delete void...