मुझे pthreads में समस्या है जहां मुझे लगता है कि मुझे डेडलॉक मिल रहा है। मैंने एक अवरुद्ध कतार बनाई है जिसे मैंने सोचा था कि काम कर रहा था, लेकिन कुछ और परीक्षण करने के बाद मुझे पता चला है कि अगर मैं ब्लॉकिंग_क्यू पर अवरुद्ध कर रहे कई धागे को आजमाता हूं और रद्द करता हूं, तो मुझे लगता है कि मुझे डेडलॉक मिल रहा है।सी ++ पर्थ्रेड अवरुद्ध कतार डेडलॉक (मुझे लगता है)
अवरुद्ध कतार बहुत सरल है और इस तरह दिखता है:
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() रद्दीकरण बिंदु है, इसलिए उन थ्रेडों पर रद्द करने से उन्हें निष्पादन को रोकना चाहिए (और यह केवल 1 धागे के साथ काम करता है)। हालांकि pthread_mutex_lock रद्द करने का बिंदु नहीं है। जब pthread_cancel() कहा जाता है, तो कुछ रद्द हो सकता है, रद्द किए गए थ्रेड को समाप्त करने से पहले म्यूटेक्स प्राप्त होता है और इसे अनलॉक नहीं करता है, और फिर जब अगला थ्रेड रद्द हो जाता है तो यह म्यूटेक्स और डेडलॉक्स को प्राप्त नहीं कर सकता है? या क्या कुछ और है जो मैं गलत कर रहा हूं।
कोई सलाह सुंदर होगी। धन्यवाद :)
कोशिश का उपयोग कर [helgrind] (http://valgrind.org/info/tools.html#helgrind), यह उपयोगी अतीत में मेरे लिए किया गया है दौड़ की स्थिति और deadlocks तलाशने के लिए। – Flexo
रद्दीकरण विश्वासघाती हो सकता है। कृपया हमें अपना अधिक तर्क दिखाएं: आपके कार्यकर्ता धागे की रद्द करने की स्थिति क्या है?क्या सफाई हैंडलर? और आप कई धागे को रद्द/शामिल करने के लिए कॉल कैसे अनुक्रमित कर रहे हैं? – pilcrow