Как это выглядит:
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)
Я не уверен, что я правильно использую уникальную блокировку, если нет, то цель состоит только в том, чтобы блокировать блокировку условно (при сохранении семантики блокировки по объему).