创建boost线程时,Shared_ptr永远不会释放
Shared_ptr never deallocated when boost threads created
这里有一个奇怪的情况。我有以下代码:
int main()
{
std::shared_ptr<MyClassA> classA = std::shared_ptr<MyClassA>(new MyClassA);
std::shared_ptr<MyClassB> classB = std::shared_ptr<MyClassB>(new MyClassB(classA));
boost::thread_group threadGroup;
// This thread is essentially an infinite loop waiting for data on a socket
threadGroup.create_thread( boost::bind(&MyClassB::method1, classB) );
...do stuff
return 0;
}
MyClassB打开几个资源,这些资源在程序退出时不会被释放。但是,如果我删除对create_thread的调用,资源将被释放。我在MyClassB的析构函数中打印输出,并验证如果创建了该线程,它不会被调用。
有人知道这是怎么回事吗?
根据文档boost::thread_group
析构函数销毁所有已拥有的线程。boost::thread
析构函数顺序:
BOOST_THREAD_DONT_PROVIDE_THREAD_DESTRUCTOR_CALLS_TERMINATE_IF_JOINABLE:如果*this有一个相关的执行线程,调用detach(), DEPRECATED
- BOOST_THREAD_PROVIDES_THREAD_DESTRUCTOR_CALLS_TERMINATE_IF_JOINABLE:如果线程是可连接的调用std::终止。破坏*。
所以你需要显式地连接线程。您可以通过在程序末尾调用boost::thread_group::join_all()
来做到这一点。
由于您正在将指向类B的共享指针传递给线程,因此线程现在共享该实例。在此线程自然退出之前,此资源不会被释放。
// This thread is essentially an infinite loop waiting for data on a socket
这个评论很有说服力。您的线程可能会永远运行,远远超过程序的结束时间。如果是这种情况,您需要在退出main之前分离线程,并且您应该不会看到析构函数被调用。线程仍然是活的,并共享该对象的所有权。
...do stuff
如果...do stuff
不涉及分离或加入该线程,则在Boost中调用未定义行为。如果您从使用boost::thread
切换到使用std::thread
,则未定义的行为将变得非常明确。
这种定义良好的行为是任何一个理智的程序员都不想调用的:破坏一个可接合的线程会导致对std::terminate()
的调用。std::terminate
的行为依赖于实现,但通常它意味着"立即停止"。不调用析构函数,不调用退出处理程序。
- CLANG 编译器 说:变量"PTR"可能未初始化
- 为什么是谷神星协方差.计算()似乎永远运行而不返回?
- 在以唯一ptr为值的C++映射中,动态内存何时会被销毁
- 密码登录程序将永远循环并显示不正确的结果
- 将 ptr 传递给 ptr 到 A 作为参数传递给 A 的函数是不好的做法吗?
- 我想在C++中读取一些多个字符,但它永远不会读取第二个字符
- SFML 碰撞永远不会在我的系统中注册
- 为共享 ptr 向量实现复制 c'tor?
- 字符和整数中 **(ptr+1) 的值差异
- C++:在不中断共享的情况下通过引用传递共享 PTR?
- 先进先出:一个进程永远不会从管道读取
- 如何将派生类从基 ptr 分配给 nlohmann::json
- 移动构造函数永远不会被调用
- 引用 std::shared:ptr 以避免引用计数
- 程序永远不会进入虚拟析构函数
- 为什么我不能在不进行任何转换的情况下将浮点数放入任何类型的 ptr 中?
- 在 *.cpp 文件中实现的 c++ 函数/方法永远不会内联扩展吗?
- 在调用函数时,ptr** 和 ptr*& 之间是否有区别,或者首选C++?
- 另一种类型的智能ptr,比如具有弱refs的unique_ptr
- 尝试打印出 *ptr++ 的值,以了解它是如何工作的