我遇到了pthreads的問題,我認爲我陷入了僵局。我創建了一個我認爲正在工作的阻塞隊列,但是在做了一些更多的測試之後,我發現如果我嘗試並取消阻塞在blocking_queue上的多個線程,我似乎會陷入僵局。C++ pthread阻塞隊列死鎖(我認爲)
阻塞隊列是非常簡單的,看起來像這樣:
template <class T> class Blocking_Queue
{
public:
Blocking_Queue()
{
pthread_mutex_init(&_lock, NULL);
pthread_cond_init(&_cond, NULL);
}
~Blocking_Queue()
{
pthread_mutex_destroy(&_lock);
pthread_cond_destroy(&_cond);
}
void put(T t)
{
pthread_mutex_lock(&_lock);
_queue.push(t);
pthread_cond_signal(&_cond);
pthread_mutex_unlock(&_lock);
}
T pull()
{
pthread_mutex_lock(&_lock);
while(_queue.empty())
{
pthread_cond_wait(&_cond, &_lock);
}
T t = _queue.front();
_queue.pop();
pthread_mutex_unlock(&_lock);
return t;
}
priavte:
std::queue<T> _queue;
pthread_cond_t _cond;
pthread_mutex_t _lock;
}
爲了測試,我創建了4個線程,在這個阻塞隊列拉。我向阻塞隊列添加了一些打印語句,並且每個線程都進入了pthread_cond_wait()方法。但是,當我嘗試在每個線程上調用pthread_cancel()和pthread_join()時,程序就會掛起。
我也測試過這隻有一個線程,它完美的作品。
根據文檔,pthread_cond_wait()是一個取消點,因此在這些線程上調用cancel會導致它們停止執行(並且這隻適用於1個線程)。但是,pthread_mutex_lock不是取消點。當pthread_cancel()被調用時,線程會發生什麼事情,取消的線程在終止之前獲取互斥鎖並且不解鎖它,然後當下一個線程被取消時它不能獲得互斥鎖和死鎖?還是有什麼我做錯了。
任何建議將是可愛的。謝謝:)
嘗試使用[helgrind(http://valgrind.org/info/tools.html#helgrind),它是有用的,在過去對我來說發現競賽狀況和僵局。 – Flexo 2011-02-16 16:16:55
取消可能是背信棄義的。請向我們展示更多的邏輯:工作線程的可取消狀態是什麼?什麼清理處理程序?你究竟如何排序調用取消/加入多個線程? – pilcrow 2011-02-16 16:17:46