这看起来如何:
class HugeHack
{
HugeHack() : m_flag( false ) { }
void Logout( )
{
boost::lock_guard< boost::mutex > lock( m_lock );
m_flag = true;
// do stuff that in a perfect world would be atomic with library call and onLogout
// call a library function that waits for a thread to finish, that thread calls my onLogout() function before it dies
m_flag = false;
}
void onLogout()
{
boost::unique_lock< boost::mutex > l( m_lock, boost::defer_lock_t );
if( ! m_flag )
l.lock();
// do stuff
}
boost::mutex m_lock;
bool m_flag;
};
只有在Logout运行时,该标志才为真,Logout合法地等待一个线程停止调用onLogout,所以除非其他人可以调用onLogout ...(不能完全确定我的库不是我用的 - 的QuickFix)
我不确定我是否正确使用了唯一锁,如果没有,目标只是有条件地锁定锁(同时保持范围锁定语义)。
答案 0 :(得分:1)
问题是如果你在没有锁定互斥锁的情况下读取m_flag,你可能会看到m_flag是假的,即使实际上它是真的,并且Logout正在运行中。锁定互斥锁会发出内存栅栏,这对于确保正确的内存可见性至关重要。 BTW stijn是对的 - 如果这是你所追求的全部,你可以抛弃m_flag并使用try_lock代替,如下所示:
boost::mutex::scoped_try_lock l( m_lock );
if ( l )
// lock succeeded
答案 1 :(得分:0)
听起来你想做的就是在你等待线程终止时释放Logout
中的锁(并调用onLogout
)。所以这样做,然后无条件地锁定onLogout
。