c 11 實現訊號量

2021-08-04 07:36:28 字數 1605 閱讀 5120

簡單來說,就是訊號量太容易出錯了(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();

}

訊號量本身是乙個全域性物件,count1,一次只允許乙個執行緒訪問:

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...