我有一個類,Queue
,我試圖讓線程安全。它有三個成員變量:另一個線程安全隊列實現
std::queue<T> m_queue;
pthread_mutex_t m_mutex;
pthread_cond_t m_condition;
和push和pop實現爲:
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);
}
和析構函數,相應的 '破壞' 電話。
你正在像'gdb'這樣的調試器中運行它嗎? 'push()'或'pop()'在中間拋出異常/崩潰? – Anthony
不好意思說,但是你的代碼不包含任何錯誤......而且寫得很好......嘗試用gdb進行調試,但問題不在於你在找的地方 – benjarobin
小修正:在push函數中if (!m_queue.empty())'始終爲真 – benjarobin