Tôi đang cố gắng viết một ứng dụng luồng khá đơn giản, nhưng mới để thư viện chủ đề của boost. Một chương trình thử nghiệm đơn giản, tôi đang làm việc trên là:(đơn giản) tăng thread_group câu hỏi
#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;
}
Tuy nhiên, khi tôi biên dịch và chạy chương trình này tôi nhận được một sản lượng
$ ./test
300000
test: pthread_mutex_lock.c:87: __pthread_mutex_lock: Assertion `mutex->__data.__owner == 0' failed.
Aborted
Rõ ràng, kết quả là đúng nhưng tôi lo lắng về thông báo lỗi này, đặc biệt là vì chương trình thực sự, mà về cơ bản có cùng cấu trúc, đang bị kẹt tại điểm join_all(). Ai đó có thể giải thích cho tôi điều gì đang xảy ra? Có cách nào tốt hơn để thực hiện việc này, tức là khởi chạy một số luồng, lưu trữ chúng trong một vùng chứa bên ngoài và sau đó chờ cho tất cả chúng hoàn thành trước khi tiếp tục chương trình không?
Cảm ơn sự giúp đỡ của bạn.
Bạn nên xóa dấu chấm lửng giữa phân bổ bộ nhớ "mới" và giao nó cho nhóm thread_group. Nếu không, nếu có điều gì đó sai (tức là ném) trong mã can thiệp, bạn sẽ làm rò rỉ sợi chỉ. –
Có, điều này có vẻ như là trường hợp và cũng là nguyên nhân của lỗi trong chương trình lớn hơn. Ví dụ làm việc hiện sử dụng: // khởi chạy ba luồng g.add_thread (chuỗi tăng mới :: thread (threaded_function, 10)); g.add_thread (new boost :: thread (threaded_function, 10)); g.add_thread (new boost :: thread (threaded_function, 10)); – RandomGuy
Cách tốt nhất để đảm bảo bạn không bị rò rỉ là sử dụng lệnh std :: unique_ptr hoặc giải pháp tương tự và sử dụng ptr.get() để cung cấp luồng cho group_thread. –
Klaim