「tick tock」パターンで進行するには2つのスレッドが必要です。セマフォと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)mutexは変数へのアクセスを同期させ、別のスレッドに情報を伝えることができるようです。
最後に、std::condition_variable
で実装されている場合は正しく見えますが、より複雑です(tick_vs_tock変数、mutex、および条件変数)。簡潔にするために実装を省略しましたが、実際はまっすぐです。
ミューテックス溶液は良好ですか?それとも何か微妙に間違っていますか?
考えていないマイティック/トックの問題を解決する良いパターンがありますか?
BTW:この問題は、C++ 0xに 'std :: semaphore'がなく、二重' std :: mutex'ソリューションが 'std :: condition_variable'ソリューションより複雑ではないために発生します。 –
(なぜ)それを保持していないスレッドのmutexを 'unlock()'することは有効ですか? –
@Steveは本当に良い質問です(ヒント、ヒント、ナッジ、ナッジ)。 –