提升线程 - 超出范围的可能性

时间:2013-06-16 07:28:48

标签: c++ boost-thread

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

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

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

1 个答案:

答案 0 :(得分:2)

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

还要注意thread类是一个奇怪的野兽 - 当超出范围时唯一发生的事情是,你的主线程不再有句柄来调用{{ 1}}。它超出父线程的范围这一事实对子线程没有任何影响。一旦你通过实例化你的子线程产生它,孩子基本上与父子解耦(好吧,父母中可见的全局/动态分配的内存对孩子也是可见的,但如果你想要你需要互斥量修改/改变那些全局变量)。正如我后面在帖子中提到的,您需要深入了解线程上下文中的内存可见性和所有权。只是在这里阅读我的评论可能对你没有帮助。

如果您希望主线程在子线程完成时等待,您需要将这些线程存储在循环外的t.join()中,然后在第二个循环中,调用std::vector<boost::thread> v; on所有这些情况。

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

此外,您可能希望使用...std::thread代替促销版本。

最后一点:我怀疑你还在尝试使用线程。如果这是真的,那么在您尝试修复此代码之前,使用更简单的示例阅读并尝试更多内容可能是个好主意。否则,你可能会为自己设置一个受伤的世界(调试地狱,包括竞争条件,奇怪的内存同步问题等等。)。

尝试更好地理解内存和线程发生的事情:什么线程可以看到什么内存,哪些内存可以和不可以共享。