상당히 간단한 스레드 응용 프로그램을 작성하려고하지만 boost 스레드 라이브러리를 처음 사용합니다. 내가 일하고 있어요 간단한 테스트 프로그램은 다음과 같습니다(simple) boost thread_group 질문
#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() 지점에서 멈추고 있기 때문에 특히이 오류 메시지에 대해 누군가 나에게 무슨 일이 일어 났는지 설명 할 수 있습니까? 이를 수행하는 더 좋은 방법이 있습니까? 즉, 많은 수의 스레드를 실행하고 외부 컨테이너에 저장 한 다음 프로그램을 계속하기 전에 모든 스레드가 완료 될 때까지 기다릴 수 있습니까?
도움 주셔서 감사합니다.
"새"메모리 할당 사이의 줄임표를 제거하고 thread_group에 전달해야합니다. 그렇지 않으면 개입 코드에서 문제가 발생하여 (즉, throw) 스레드가 누출됩니다. –
예, 이것이 사실 인 것으로 보이며 큰 프로그램에서도 버그의 원인이었습니다. 이제 작업 예제에서 다음을 사용합니다. // 세 개의 스레드 시작 g.add_thread (new boost :: thread (threaded_function, 10)); g.add_thread (새 부스트 :: thread (threaded_function, 10)); g.add_thread (새 부스트 :: thread (threaded_function, 10)); – RandomGuy
좋은 방법은 std :: unique_ptr 또는 유사한 해결책을 사용하고 ptr.get()을 사용하여 group_thread에 스레드를 제공하는 것입니다. –
Klaim