【问题标题】:thread ownership线程所有权
【发布时间】:2015-09-24 12:15:36
【问题描述】:

B线程可以在A线程中创建吗?

等待B线程结束后,A线程能否继续运行?

【问题讨论】:

标签: c++ boost


【解决方案1】:

简答

  1. 是的
  2. 是的

线程 A 和主线程在概念上几乎没有区别。 请注意,您甚至可以在主线程中加入线程 B,即使它是从线程 A 创建的。

示例:(如果您还没有 c++11 编译器,请将 <thread> 替换为 <boost/thread.hpp>

Live On Coliru

#include <thread>
#include <iostream>

void threadB() {
    std::cout << "Hello world\n";
}

void threadA() {
    std::thread B(threadB);
    B.join();

    std::cout << "Continued to run\n";
}

int main() {
    std::thread A(threadA);
    A.join(); // no difference really
}

打印

Hello world
Continued to run

【讨论】:

  • 尝试做一些密集的工作,然后打印 cout。如果两个线程有​​任何密集的工作或 I/O,我认为这个示例不能保证这种调度。
  • 问题不在于调度。事实上,如果你有独立的后台线程,你通常会从同一个“主”运行中创建它们(并且有一个任务队列来分配工作)
  • 我不确定不是。他提到了线程运行的特定顺序。你不能认为他的用例是一个简短的例子。否则,这是完成工作的一个很好的垫脚石。
  • @Matt 您在正确的问题上发帖吗?就 OP 提到的序列而言,我的样本保证了这一点。 (线程 B 退出后线程 A 继续运行)。而且我不认为我们对 OP 的“用例”一无所知。他有两个关于线程创建的非常有限的问题。
  • (等待B线程结束后)这意味着A等待整个B。
【解决方案2】:

如果 B 是 A 的子线程?

有一些方法可以同步轮流线程。它们是否可以并行运行取决于使用内核线程或用户线程。用户线程不知道不同的处理器,因此它们无法真正“并行”运行。如果您希望线程轮流使用,您可以使用互斥锁/信号量/锁来同步它们。如果您希望它们真正并行运行,则需要 B 成为 A 的子进程。

您也可以结束子线程/进程,在这种情况下,父线程/进程将被调度。如果没有某种同步,通常无法保证调度。

【讨论】:

  • 感谢您的回复。
  • 但是我遇到了一些关于线程同步的问题,虽然我已经按照你提到的那样做了,请看我的问题。
  • 同步线程很棘手,因为你不得不担心它们会死锁。每个线程都在等待另一个线程。在线程上使用超时并设计某种重新同步机制是有效的。
  • void FuncA() { if(ScanResultsMonitorThread == NULL) { /* 启动线程 A / } } void FunAThread() { while(1) { FuncB(); } } void FuncB() { 尝试 { boost::this_thread::sleep(boost::posix_time::seconds(25)); } catch(const boost::thread_interrupted&) { } if(needRestart){/ 创建线程 B / boost::thread Restart(&FuncBThread,this); boost::this_thread::sleep(boost::posix_time::seconds(10)); / 程序不能在这里运行,线程A结束,为什么? */ } 其他 { } }
  • 如果你把代码正确地放到网站上就好了,但是调用 sleep 对一个人来说很奇怪。
【解决方案3】:

void FuncA() {

    if(ScanResultsMonitorThread == NULL) {
    /* start thread A */
    }

}

void FunAThread() {

    while(1) {
        FuncB();
    }

}

void FuncB() {

try {
    boost::this_thread::sleep(boost::posix_time::seconds(25));
}
catch(const boost::thread_interrupted&) {

}

if(needRestart){
    /* create thread B */ 
    boost::thread Restart(&FuncBThread,this);
    boost::this_thread::sleep(boost::posix_time::seconds(10));
    /* program can not run here and thread A end, why? */ 
}
else {

}

}

【讨论】:

  • 从代码来看,为什么线程B结束后线程A也终止了?
  • 休眠父线程不好。您应该阻止父线程。也许线程 B 永远不会回来?我不熟悉 boost 库,否则我可能会提供更多帮助。
  • 感谢您指出,我已经解决了我的问题,是的,它不应该在父线程中休眠,我使用 time_joined() 等待子线程在父线程中结束,这修复了问题。
猜你喜欢
  • 1970-01-01
  • 2016-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-20
  • 2018-11-23
相关资源
最近更新 更多