Tôi đang gặp vấn đề với pthreads nơi tôi nghĩ rằng tôi đang nhận được một bế tắc. Tôi đã tạo ra một hàng đợi chặn mà tôi nghĩ đã làm việc, nhưng sau khi làm một số thử nghiệm nhiều hơn tôi đã thấy rằng nếu tôi cố gắng và hủy bỏ nhiều chủ đề đang chặn trên blocking_queue, tôi dường như để có được một bế tắc.C + + ngăn chặn hàng đợi chặn bế tắc (tôi nghĩ)
Hàng đợi chặn là rất đơn giản và trông như thế này:
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;
}
Để thử nghiệm, tôi đã tạo ra 4 đề mà kéo vào hàng đợi chặn này. Tôi đã thêm một số câu lệnh in vào hàng đợi chặn và mỗi luồng đang chuyển sang phương thức pthread_cond_wait(). Tuy nhiên, khi tôi cố gắng gọi pthread_cancel() và pthread_join() trên mỗi luồng chương trình chỉ bị treo.
Tôi cũng đã thử nghiệm điều này chỉ với một chuỗi và hoạt động hoàn hảo.
Theo tài liệu, pthread_cond_wait() là điểm hủy, do đó, việc hủy cuộc gọi trên các chuỗi đó sẽ khiến chúng ngừng thực thi (và thao tác này chỉ hoạt động với 1 chuỗi). Tuy nhiên pthread_mutex_lock không phải là một điểm hủy bỏ. Có thể một cái gì đó đang xảy ra dọc theo dòng khi pthread_cancel() được gọi, chủ đề bị hủy bỏ thu hút mutex trước khi chấm dứt và không mở khóa nó, và sau đó khi thread tiếp theo bị hủy, nó không thể thu được mutex và deadlocks? Hay có điều gì khác mà tôi đang làm sai.
Mọi lời khuyên đều đáng yêu. Cảm ơn :)
hãy thử sử dụng [Helgrind] (http://valgrind.org/info/tools.html#helgrind), nó rất hữu ích trong quá khứ đối với tôi để phát hiện tình trạng đua và deadlocks. – Flexo
Việc hủy có thể gây nguy hiểm. Vui lòng cho chúng tôi biết thêm về logic của bạn: trạng thái hủy của chủ đề công nhân của bạn là gì?Xử lý dọn dẹp nào? Và chính xác như thế nào là bạn sắp xếp các cuộc gọi để hủy bỏ/tham gia vào nhiều chủ đề? – pilcrow