我需要两个线程以“tick tock”的模式进行。 使用信号量实现时,它看起来很好:
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();
}
}
我认为问题出在mutex不应该向另一个线程传递信息。(C++11标准委员会在try_lock中添加了一个无意义的失败来防止意外的信息传递; §30.4.1/14。)似乎mutex的作用是同步对变量的访问,然后变量才能向另一个线程传递信息。
最后,当使用std::condition_variable实现时,看起来是正确的,但更加复杂(需要tick_vs_tock变量、mutex和condition variable)。为了简洁起见,我省略了具体实现,但它非常直接明了。
这个mutex解决方案是否可行?还是有什么微妙的问题?
有没有解决我的tick/tock问题的好方法我还没有想到的?
std::semaphore
,而双重std::mutex
解决方案比std::condition_variable
解决方案更简单。 - deft_codeunlock()
函数是否有效? - Steve Jessop