【发布时间】:2015-09-24 12:15:36
【问题描述】:
B线程可以在A线程中创建吗?
等待B线程结束后,A线程能否继续运行?
【问题讨论】:
-
您是否知道
detach和join操作以及线程object 的生命周期与线程本身的生命周期有何不同?阅读stackoverflow.com/questions/5874493/… 可能是有利可图的
B线程可以在A线程中创建吗?
等待B线程结束后,A线程能否继续运行?
【问题讨论】:
detach 和join 操作以及线程object 的生命周期与线程本身的生命周期有何不同?阅读stackoverflow.com/questions/5874493/… 可能是有利可图的
简答
线程 A 和主线程在概念上几乎没有区别。 请注意,您甚至可以在主线程中加入线程 B,即使它是从线程 A 创建的。
示例:(如果您还没有 c++11 编译器,请将 <thread> 替换为 <boost/thread.hpp>)
#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
【讨论】:
如果 B 是 A 的子线程?
有一些方法可以同步轮流线程。它们是否可以并行运行取决于使用内核线程或用户线程。用户线程不知道不同的处理器,因此它们无法真正“并行”运行。如果您希望线程轮流使用,您可以使用互斥锁/信号量/锁来同步它们。如果您希望它们真正并行运行,则需要 B 成为 A 的子进程。
您也可以结束子线程/进程,在这种情况下,父线程/进程将被调度。如果没有某种同步,通常无法保证调度。
【讨论】:
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 {
}
}
【讨论】: