Я пытаюсь написать довольно простое приложение с резьбой, но я новичок в библиотеке потоков boost. Простая тестовая программа, я работаю на это:(simple) boost thread_group question
#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. В противном случае, если что-то пойдет не так (то есть броски) в промежуточном коде, вы пропустите поток. –
Да, это, по-видимому, так и было причиной ошибки в более крупной программе. В рабочем примере теперь используется: // запуск трех потоков g.add_thread (новый boost :: thread (threaded_function, 10)); g.add_thread (новый boost :: thread (threaded_function, 10)); g.add_thread (новый boost :: thread (threaded_function, 10)); – RandomGuy
Хорошим способом убедиться, что вы не просочились, было бы использовать std :: unique_ptr или подобное решение и использовать ptr.get(), чтобы обеспечить поток для group_thread. –
Klaim