C++ (简单)推进线程组问题
我正试图编写一个相当简单的线程应用程序,但我是boost线程库的新手。我正在进行的一个简单测试程序是: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) {}
#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;
}