锁定计划一个黑客

时间:2010-09-03 14:46:20

标签: c++ synchronization

这看起来如何:

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)

我不确定我是否正确使用了唯一锁,如果没有,目标只是有条件地锁定锁(同时保持范围锁定语义)。

2 个答案:

答案 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