信号量类在行动
以下函数添加了四个线程。三个线程竞争信号量,信号量设置为一个。较慢的线程调用 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();
...
}