我需要兩個線程進行「tick tock」模式。當用旗語implmented這看起來不錯:使用互斥量作爲信號量?
Semaphore tick_sem(1);
Semaphore tock_sem(0);
void ticker(void)
{
while(true)
{
P(tick_sem);
do_tick();
V(tock_sem);
}
}
void tocker(void)
{
while(true)
{
P(tock_sem);
do_tock();
V(tick_sem);
}
}
但是,如果我做同樣的事情用一個互斥體(這在技術上是一個二進制信號),它有一個奇怪的碼味。
std::mutex tick_mutex;
std::mutex tock_mutex;
tock_mutex.lock();
void ticker(void)
{
while(true)
{
tick_mutex.lock();
do_tick();
tock_mutex.unlock();
}
}
void tocker(void)
{
while(true)
{
tock_mutex.lock()
do_tock();
tick_mutex.unlock();
}
}
我覺得味道是一個互斥體並不意味着將信息傳遞給另一個線程。 (C++ 11標準委員會增加了一個錯誤的try_lock來阻止意外的信息傳輸;第30.4.1/14節)似乎互斥鎖是爲了同步對變量的訪問,然後該變量可以將信息傳遞給另一個線程。
最後,當執行std::condition_variable
時,它看起來是正確的,但它更復雜(一個tick_vs_tock變量,一個互斥量和一個條件變量)。爲了簡潔,我省略了實現,但它非常簡單。
互斥體解決方案是否正確?或者是有一些微妙的錯誤呢?
有沒有一個很好的模式來解決我沒有想到的tick/tock問題?
順便說一句:這個問題的出現只是因爲C++ 0x沒有'std :: semaphore',雙std :: mutex'解決方案比'std :: condition_variable'解決方案更簡單。 –
(爲什麼)在當前不存在的線程中解鎖()一個互斥鎖是否有效? –
@Steve這真的是一個很好的問題(提示,提示,微調,微調)。 –