मैं बूस्ट लाइब्रेरी में एक नवागत हूं, और साझा कतार पर संचालित एक साधारण निर्माता और उपभोक्ता थ्रेड को लागू करने की कोशिश कर रहा हूं। मेरे उदाहरण दिया गया इस तरह दिखता है:सरल साझा डेटा लॉकिंग के लिए boost :: lock_guard का उपयोग करना
#include <iostream>
#include <deque>
#include <boost/thread.hpp>
boost::mutex mutex;
std::deque<std::string> queue;
void producer()
{
while (true) {
boost::lock_guard<boost::mutex> lock(mutex);
std::cout << "producer() pushing string onto queue" << std::endl;
queue.push_back(std::string("test"));
}
}
void consumer()
{
while (true) {
boost::lock_guard<boost::mutex> lock(mutex);
if (!queue.empty()) {
std::cout << "consumer() popped string " << queue.front() << " from queue" << std::endl;
queue.pop_front();
}
}
}
int main()
{
boost::thread producer_thread(producer);
boost::thread consumer_thread(consumer);
sleep(5);
producer_thread.detach();
consumer_thread.detach();
return 0;
}
इस कोड मैं उम्मीद के रूप में चलाता है, लेकिन जब main
बाहर निकलता है, मैं
/usr/include/boost/thread/pthread/mutex.hpp:45:
boost::mutex::~mutex(): Assertion `!pthread_mutex_destroy(&m)' failed.
consumer() popped string test from queue
Aborted
मिल (मुझे यकीन है कि अगर consumer
से उत्पादन में प्रासंगिक है नहीं कर रहा हूँ स्थिति, लेकिन मैंने इसे छोड़ दिया है।)
क्या मैं बूस्ट के उपयोग में कुछ गलत कर रहा हूं?
मैं किसी विशेष प्रकार के ऐप को लिखने की कोशिश नहीं कर रहा हूं- मैं बूस्ट से परिचित होने की कोशिश कर रहा हूं। थ्रेड लाइब्रेरी। त्वरित डिबग सत्र के दौरान 'डिटेच' की कॉल डाली गई थी; यदि व्यवहार उन्हें हटा देता है तो व्यवहार समान होता है।मुझे शुरुआत में संदेह था कि प्रोग्राम से बाहर होने से पहले थ्रेड को रोकना होगा, इसलिए 'डिटेच' कॉल। – kfb
तुरंत मुख्य धागे से बाहर निकलें और उपभोक्ता और निर्माता को अलग न करें। अपने उपभोक्ता और निर्माता काम तक मुख्य धागे में प्रतीक्षा करें। और जब वे समाप्त हो जाते हैं तो उनसे जुड़ें। और फिर मुख्य से बाहर निकलें। –
यह समझ में आता है, और दावा रोकता है, धन्यवाद! – kfb