gpt4 book ai didi

c++ - Boost线程 - 超出范围的可能性

转载 作者:太空狗 更新时间:2023-10-29 21:45:39 25 4
gpt4 key购买 nike

我很好奇下面代码的准确性

for(int i=0 ; i<5 ; i++)
{
SomeClass* ptrinst = new SomeClass()
boost::thread t( boost::bind (&SomeClass::SomeMethod,ptrinst));
......
}

当 t 超出范围时,正在运行的线程会发生什么?

最佳答案

由于主线程没有调用t.join() ,主线程将继续运行它的循环,产生额外的线程,然后继续向前。所以答案是,在您当前的编码下,子线程不会与您的父线程交互(至少不会直接交互)。

另请注意 thread class 是一个奇怪的野兽 - 当你超出范围时唯一发生的事情是,你的主线程不再有句柄来调用 t.join()在。它超出父线程范围的事实对子线程的影响为零。一旦你通过实例化它来生成你的子线程,子线程基本上就与父线程分离了(好吧,在父线程中可见的全局/动态分配的内存对子线程也是可见的,但如果你想要的话,你将需要互斥锁修改/改变那些全局变量)。正如我稍后在博文中提到的,您需要对线程上下文中的内存可见性和所有权有深入的了解。只阅读我在这里的评论可能对您没有帮助。

如果您希望主线程等待子线程完成,您需要将这些线程存储在std::vector<boost::thread> v; 中。在你的循环之外,然后在第二个循环中,调用 join在所有这些实例上。

您当前的代码看起来有点可疑,因为您正在通过绑定(bind)调用实例方法 - 这很好,但我通常不希望该实例方法调用 delete this;这意味着由父线程来清理(在子线程完成之前,父线程不应该清理)。但是,如果没有某种线程同步,它就无法在正确的时间进行清理。因此,几乎可以肯定内存泄漏或某种令人讨厌的竞争条件(假设您将 delete ptrinst; 放入主线程的 ... 部分以尝试清理。如果没有某种同步,您可能会删除子线程使用它完成之前的指针)。

此外,您可能想使用 std::threadstd::bind代替提升版本。

最后一点:我怀疑您仍在尝试使用线程。如果这是真的,那么在您尝试修复此代码之前,最好阅读并使用更简单的示例进行更多实验。否则,您可能会让自己陷入痛苦的世界(调试 hell ,包括竞争条件、奇怪的内存同步问题等...)。

尝试更深入地了解内存和线程会发生什么:哪些内存对哪些线程可见,哪些内存可以共享,哪些不能共享。

关于c++ - Boost线程 - 超出范围的可能性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17131110/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com