Схема блокировки взломать - PullRequest
       1

Схема блокировки взломать

0 голосов
/ 03 сентября 2010

Как это выглядит:

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 ]

1 голос
/ 03 сентября 2010

Проблема в том, что если вы читаете m_flag без блокировки мьютекса, вы можете увидеть, что m_flag имеет значение false, даже если на самом деле это правда, и Logout находится в середине операции.Блокировка мьютекса приводит к ограничению памяти, что необходимо для обеспечения надлежащей видимости памяти.И, кстати, stijn прав: если это все, что вам нужно, вы можете отказаться от m_flag и использовать вместо него try_lock, например:

boost::mutex::scoped_try_lock l( m_lock );
if ( l )
    // lock succeeded
0 голосов
/ 03 сентября 2010

Звучит так, как будто вы хотите снять блокировку в Logout в точке, в которой вы ожидаете завершения потока (и вызовите onLogout). Так что сделайте это вместо этого, затем безоговорочно возьмите блокировку в onLogout.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...