我很好奇以下代码的准确性
for(int i=0 ; i<5 ; i++)
{
SomeClass* ptrinst = new SomeClass()
boost::thread t( boost::bind (&SomeClass::SomeMethod,ptrinst));
......
}
当t超出范围时,正在运行的线程会发生什么?
答案 0 :(得分:2)
由于主线程没有调用t.join()
,主线程将继续运行其循环,产生其他线程然后继续。所以答案是,在你当前的编码下,子线程不会与你的父线程交互(至少不是直接)。
还要注意thread
类是一个奇怪的野兽 - 当超出范围时唯一发生的事情是,你的主线程不再有句柄来调用{{ 1}}。它超出父线程的范围这一事实对子线程没有任何影响。一旦你通过实例化你的子线程产生它,孩子基本上与父子解耦(好吧,父母中可见的全局/动态分配的内存对孩子也是可见的,但如果你想要你需要互斥量修改/改变那些全局变量)。正如我后面在帖子中提到的,您需要深入了解线程上下文中的内存可见性和所有权。只是在这里阅读我的评论可能对你没有帮助。
如果您希望主线程在子线程完成时等待,您需要将这些线程存储在循环外的t.join()
中,然后在第二个循环中,调用std::vector<boost::thread> v;
on所有这些情况。
当你通过绑定调用实例方法时,你当前的代码看起来有点可疑 - 这很好,但我通常不希望实例方法调用join
,这意味着它&# 39;直到父线程清理(父线程不应该清理直到子线程完成)。但是,如果没有某种线程同步,它就无法在正确的时间进行清理。因此,几乎可以确保内存泄漏或某种令人讨厌的竞争条件(假设您在主线程的delete this;
部分放置delete ptrinst;
以尝试清理。没有某种同步,你可以在子线程完成之前删除指针)。
此外,您可能希望使用...
和std::thread
代替促销版本。
最后一点:我怀疑你还在尝试使用线程。如果这是真的,那么在您尝试修复此代码之前,使用更简单的示例阅读并尝试更多内容可能是个好主意。否则,你可能会为自己设置一个受伤的世界(调试地狱,包括竞争条件,奇怪的内存同步问题等等。)。
尝试更好地理解内存和线程发生的事情:什么线程可以看到什么内存,哪些内存可以和不可以共享。