线程所有权

时间:2015-07-07 06:27:47

标签: c++ boost

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

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

3 个答案:

答案 0 :(得分:1)

简短回答

  1. 线程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
    

答案 1 :(得分:0)

如果B是A的子线程?

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

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

答案 2 :(得分:0)

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 {

}

}