信号量类在行动

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

    ...
    }