【发布时间】:2011-10-11 20:30:32
【问题描述】:
我需要两个线程以 “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();
}
}
我认为这种气味是互斥体并不意味着将信息传达给另一个线程。 (c++11 标准委员会在 try_lock 中添加了一个虚假的失败,以阻止意外的信息传输;§30.4.1/14。)似乎互斥锁旨在同步对变量的访问,然后可以将信息传递给另一个线程。
最后,当使用std::condition_variable 实现时,它看起来正确但更复杂(tick_vs_tock 变量、互斥体和条件变量)。为简洁起见,我省略了实现,但它真的很简单。
互斥体解决方案好吗?还是有什么微妙的问题?
有没有一个很好的模式来解决我没有想到的滴答/滴答问题?
【问题讨论】:
-
顺便说一句:这个问题的出现只是因为 C++0x 没有
std::semaphore并且双std::mutex解决方案没有std::condition_variable解决方案复杂。 -
(为什么)
unlock()线程中的互斥锁是否有效? -
@Steve 这是一个非常好的问题(提示、提示、轻推、轻推)。
标签: c++ concurrency c++11 mutex semaphore