Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ (简单)推进线程组问题_C++_Multithreading_Boost_Boost Thread - Fatal编程技术网

C++ (简单)推进线程组问题

C++ (简单)推进线程组问题,c++,multithreading,boost,boost-thread,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线程库的新手。我正在进行的一个简单测试程序是:

#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;
}
显然,结果是正确的,但我担心这个错误消息,特别是因为实际程序(基本上具有相同的结构)在join_all()点卡住了。有人能给我解释一下发生了什么事吗?是否有更好的方法来执行此操作,即启动多个线程,将它们存储在外部容器中,然后等待它们全部完成,然后再继续程序

感谢您的帮助。

添加线程()拥有您传入的线程的所有权。线程组删除该线程。在本例中,您正在删除堆栈上分配的内存,这几乎是死罪

成员函数添加线程()

无效添加螺纹(螺纹*thrd)

前提条件

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

效果:

获得boost::线程的所有权 thrd指向的对象并将其添加 给小组

后条件

此->大小()增加1


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

我认为问题是由程序退出时调用的线程组析构函数引起的。线程组希望负责销毁线程对象。另请参见文档中的

您正在堆栈上创建线程对象,作为主函数范围内的局部变量。因此,当程序退出并且线程组试图删除它们时,它们已经被销毁

作为一种解决方案,使用new在堆上创建线程对象,并让thread_组处理它们的销毁:

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

如果您不需要线程的句柄,请尝试使用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;
}
//Snip:与前面的示例相同
int main(int argc,char*argv[])
{
使用名称空间std;
//启动三个线程
对于(int i=0;i<3;++i)
g、 创建_线程(boost::bind(threaded_函数,10));
//等他们
g、 加入所有人;

看起来上面没有一个能真正回答这个问题

我遇到了类似的问题。此警告的结果(pthread_mutex_lock.c:87:u pthread_mutex_lock:Assertion`mutex->\u data.\u owner==0)失败。 中止)是指程序有时会泄漏线程并导致boost_resource_错误异常


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

您应该删除“新”内存分配和将其交给线程组之间的省略号。否则,如果出现问题(即抛出)在插入的代码中,您将泄漏线程。是的,这似乎是这种情况,也是较大程序中出现错误的原因。工作示例现在使用://launch threads g.add_thread(new boost::thread(threaded_function,10));g.add_thread(new boost::thread(threaded_function,10));g.add_thread(new boost::thread)(threaded_function,10));确保不泄漏的一个好方法是使用std::unique_ptr或类似的解决方案并使用ptr.get()将线程提供给组\ U线程。如果添加到组中的线程数量是无限的,他是否应该在线程组终止时从线程组中删除线程?而不是让死线程堆积到程序结束?这解决了
***glibc检测到***…:双重释放或损坏(out)
.create\u thread仍然返回线程的句柄。在这种情况下可以使用create\u thread的原因是,与add\u thread不同,thread组不负责删除thread.FYI。可以理解,前面的注释是错误的,因为文档不清楚所有权。但是,从1.55.0,create_thread和add_thread都将线程添加到一个内部数组中,该数组在析构函数中迭代并在退出时删除。此代码使用create_thread将对象存储在堆上,而原始代码将对象存储在堆栈上;因此,当堆栈解卷时,对象将被删除一次,然后再次删除n在应用程序退出时删除组时。
// 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;
}