मैं काफी सरल थ्रेडेड एप्लिकेशन लिखने की कोशिश कर रहा हूं, लेकिन बूस्ट की थ्रेड लाइब्रेरी को नया करने के लिए नया हूं। एक साधारण परीक्षण कार्यक्रम मैं पर काम कर रहा हूँ है:(सरल) बूस्ट थ्रेड_ग्रुप प्रश्न
#include <iostream>
#include <boost/thread.hpp>
int result = 0;
boost::mutex result_mutex;
boost::thread_group g;
void threaded_function(int i)
{
for(; i < 100000; ++i) {}
{
boost::mutex::scoped_lock lock(result_mutex);
result += i;
}
}
int main(int argc, char* argv[])
{
using namespace std;
// launch three threads
boost::thread t1(threaded_function, 10);
boost::thread t2(threaded_function, 10);
boost::thread t3(threaded_function, 10);
g.add_thread(&t1);
g.add_thread(&t2);
g.add_thread(&t3);
// wait for them
g.join_all();
cout << result << endl;
return 0;
}
हालांकि, जब मैं संकलन और इस कार्यक्रम मैं जाहिर
$ ./test
300000
test: pthread_mutex_lock.c:87: __pthread_mutex_lock: Assertion `mutex->__data.__owner == 0' failed.
Aborted
का उत्पादन मिल चलाने के लिए, परिणाम सही है लेकिन मैं चिंतित हूँ इस त्रुटि संदेश के बारे में, विशेष रूप से क्योंकि वास्तविक कार्यक्रम, जो अनिवार्य रूप से एक ही संरचना है, join_all() बिंदु पर अटक गया है। क्या कोई मुझे बता सकता है कि क्या हो रहा है? क्या ऐसा करने का कोई बेहतर तरीका है, यानी कई धागे लॉन्च करें, उन्हें बाहरी कंटेनर में स्टोर करें, और फिर कार्यक्रम जारी रखने से पहले सभी को पूरा करने के लिए प्रतीक्षा करें?
आपकी मदद के लिए धन्यवाद।
आपको "नया" स्मृति आवंटन और इसे थ्रेड_ग्रुप में सौंपने के बीच इलिप्सिस को हटा देना चाहिए। अन्यथा अगर हस्तक्षेप कोड में कुछ गलत हो जाता है (यानी फेंकता है), तो आप धागे को रिसाव करेंगे। –
हां, यह मामला प्रतीत होता है और बड़े कार्यक्रम में भी बग का कारण था। कामकाजी उदाहरण अब उपयोग करता है: // लॉन्च तीन धागे g.add_thread (नया बूस्ट :: थ्रेड (threaded_function, 10)); g.add_thread (नया बढ़ावा :: धागा (threaded_function, 10)); g.add_thread (नया बढ़ावा :: धागा (threaded_function, 10)); – RandomGuy
यह सुनिश्चित करने का एक अच्छा तरीका है कि आप रिसाव नहीं करते हैं, यह std :: unique_ptr या इसी तरह के समाधान का उपयोग करना होगा और समूह_थ्रेड को थ्रेड प्रदान करने के लिए ptr.get() का उपयोग करना होगा। –
Klaim