訊號量類在行動

以下函式新增了四個執行緒。三個執行緒競爭訊號量,訊號量設定為一個。較慢的執行緒呼叫 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();

    ...
    }