我有一堂课,Queue
我试图使线程安全。它具有以下三个成员变量:
std::queue<T> m_queue;
pthread_mutex_t m_mutex;
pthread_cond_t m_condition;
和一个推送和弹出实现为:
template<class T> void Queue<T>::push(T value)
{
pthread_mutex_lock( &m_mutex );
m_queue.push(value);
if( !m_queue.empty() )
{
pthread_cond_signal( &m_condition );
}
pthread_mutex_unlock( &m_mutex );
}
template<class T> bool Queue<T>::pop(T& value, bool block)
{
bool rtn = false;
pthread_mutex_lock( &m_mutex );
if( block )
{
while( m_queue.empty() )
{
pthread_cond_wait( &m_condition, &m_mutex );
}
}
if( !m_queue.empty() )
{
value = m_queue.front();
m_queue.pop();
rtn = true;
}
pthread_mutex_unlock( &m_mutex );
return rtn;
}
不幸的是,偶尔会有一些问题可能是此代码的错误。也就是说,有两个线程,有时线程 1 永远不会出来,push()
有时线程 2 永远不会出来pop()
(block
参数是true
),尽管队列不为空。
我知道还有其他可用的实现,但如果需要,我想尝试修复此代码。有人看到任何问题吗?
构造函数具有适当的初始化:
Queue()
{
pthread_mutex_init( &m_mutex, NULL );
pthread_cond_init( &m_condition, NULL );
}
和析构函数,相应的“销毁”调用。