我是線程同步中的新手。我正在閱讀許多條件變量的實現,例如boost :: threads和pthread for win32。我只是用wait/notify/noifyall實現了這個非常簡單的監視器,我想這有很多隱藏的問題,我想從更有經驗的人那裏發現。任何建議?什麼是這個極端簡單的線程監視器實現不安全?
class ConditionVar
{
public :
ConditionVar() : semaphore (INVALID_HANDLE_VALUE) , total_waiters (0)
{
semaphore = ::CreateSemaphoreA (NULL , 0 /* initial count */ , LONG_MAX /* max count */ , NULL);
}
~ConditionVar()
{
::CloseHandle (semaphore) ;
}
public :
template <class P>
void Wait (P pred)
{
while (!pred()) Wait();
}
public :
void Wait (void)
{
INTERLOCKED_WRITE_RELEASE(&total_waiters,total_waiters + 1);
::WaitForSingleObject (semaphore , INFINITE);
}
//! it will notify one waiter
void Notify (void)
{
if (INTERLOCKED_READ_ACQUIRE(&total_waiters))
{
Wake (1);
}
}
void NotifyAll (void)
{
if (INTERLOCKED_READ_ACQUIRE(&total_waiters))
{
std::cout << "notifying " << total_waiters ;
Wake (total_waiters);
}
}
protected :
void Wake (int count)
{
INTERLOCKED_WRITE_RELEASE(&total_waiters,total_waiters - count);
::ReleaseSemaphore (semaphore , count , NULL);
}
private :
HANDLE semaphore;
long total_waiters;
};
這使得使用Boost庫? – lsalamon 2010-01-27 16:39:42
嗯,我剛纔複製的INTERLOCKED_READ_ACQUIRE/INTERLOCKED_WRITE_RELEASE宏,讀/使用內存柵欄的櫃檯寫入內存。 – 2010-01-27 16:44:03
@Isalamon:我想他想用Boost.Threads來推出他自己的condvar類,以獲得靈感。 – 2010-01-27 18:10:41