(简单)提升thread_group问题

时间:2009-08-07 20:21:37

标签: c++ multithreading boost boost-thread

我正在尝试编写一个相当简单的线程应用程序,但它是boost的线程库的新手。我正在研究的一个简单的测试程序是:

#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()点。有人可以向我解释发生了什么吗?有没有更好的方法来执行此操作,即启动多个线程,将它们存储在外部容器中,然后在继续执行程序之前等待它们全部完成?

感谢您的帮助。

4 个答案:

答案 0 :(得分:29)

我认为你的问题是由程序退出时调用的thread_group析构函数引起的。线程组想要负责破坏你的线程对象。另请参阅boost::thread_group文档。

您正在堆栈中创建线程对象作为main函数范围内的局部变量。因此,当程序退出并且thread_group尝试删除它们时,它们已被破坏。

作为解决方案,使用 new 在堆上创建线程对象,让thread_group处理它们的破坏:

boost::thread *t1 = new boost::thread(threaded_function, 10);
...
g.add_thread(t1);
...

答案 1 :(得分:27)

如果您不需要线程的句柄,请尝试使用thread_group :: create_thread(),这样可以减少管理线程的需要:

// Snip: Same as previous examples

int main(int argc, char* argv[])
{
    using namespace std;

    // launch three threads
    for ( int i = 0; i < 3; ++i )
        g.create_thread( boost::bind( threaded_function, 10 ) );

    // wait for them
    g.join_all();

    cout << result << endl;

    return 0;
}

答案 2 :(得分:3)

add_thread()获取您传入的线程的所有权。线程组删除该线程。在这个例子中,你正在删除在堆栈上分配的内存,几乎是一个死罪。

  

会员功能 add_thread()

     

void add_thread(thread * thrd);

     

<强>前提条件

     

表达式删除thrd是   结构良好,不会导致   未定义的行为。

     

效果:

     

获得boost :: thread的所有权   thrd指向的对象并添加它   到小组。

     

<强>后置条件

     

this-&gt; size()增加1。

不确定您的代码中是否存在错误,或者这只是示例错误。否则代码看起来很好。

答案 3 :(得分:1)

上面没有人真正回答过这个问题。

我遇到了类似的问题。此警告的结果(pthread_mutex_lock.c:87:__ pthread_mutex_lock:断言`互斥锁 - > <数据。 _owner == 0'失败。 aborted)是有时程序将泄漏线程并导致boost_resource_error异常。

原因似乎是程序在join_all()之后继续执行,尽管大多数线程仍在运行(未终止)。