訊號量類在行動
以下函式新增了四個執行緒。三個執行緒競爭訊號量,訊號量設定為一個。較慢的執行緒呼叫 notify_one()
,允許其中一個等待執行緒繼續。
結果是 s1
立即開始旋轉,導致訊號量的使用 count
保持在 1 以下。其他執行緒依次等待條件變數,直到呼叫 notify()
。
int main()
{
Semaphore sem(1);
thread s1([&]() {
while(true) {
this_thread::sleep_for(std::chrono::seconds(5));
sem.wait( 1 );
}
});
thread s2([&]() {
while(true){
sem.wait( 2 );
}
});
thread s3([&]() {
while(true) {
this_thread::sleep_for(std::chrono::milliseconds(600));
sem.wait( 3 );
}
});
thread s4([&]() {
while(true) {
this_thread::sleep_for(std::chrono::seconds(5));
sem.notify( 4 );
}
});
s1.join();
s2.join();
s3.join();
s4.join();
...
}