thread :: detach()如何在C ++ 11中工作?

时间:2016-04-15 17:00:06

标签: c++ multithreading c++11

我编写了以下代码,但我无法理解为什么它不会像在main()线程中那样打印出threadFunc()中的所有no(#0到-99)。

#include<iostream>
#include<thread>
#include<string>
#include<mutex>
#include<chrono>

using namespace std;

mutex mu;

void threadFunc(){
    for(int i=0;i>-100;i--){
    std::this_thread::sleep_for(std::chrono::milliseconds(30)); /*delay for 30ms*/
    mu.lock();
    cout<<"Thread:  "<<i<<endl;
    mu.unlock();
    }
}

main(){

    thread t1(threadFunc);   


    for(int i=0;i<100;i++){
    mu.lock();
    cout<<"Main:  "<<i<<endl;
    mu.unlock();    
    }


    cout<<"End of Main"<<endl;  

    t1.detach();   
}

该计划的输出是:

Main: 0  
Main: 1  
.  
.  
.  
Main: 99  
End of Main.  
Thread: -1 

2 个答案:

答案 0 :(得分:8)

进程在main()退出时终止,并且所有线程都被终止。您在程序中观察到此行为。

Detach基本上说从现在开始,你不能join这个帖子。但是,如果你不能join它,你就不能让main()等到它完成(除非你使用其他同步原语) - 因此它很乐意退出。

这就是为什么我强烈反对每个人都不使用分离的线程,他们很难做到正确。

答案 1 :(得分:4)

detach函数可防止在thread对象超出范围时抛出异常。通常,您需要调用join,但如果您不想阻止执行,则需要调用detach。但是,如果在thread准备退出时main仍在运行,您可能需要使用另一种同步机制来确保一切正常。请参阅以下人为举例

示例代码

#include <atomic>
#include <chrono>
#include <condition_variable>
#include <iostream>
#include <mutex>
#include <string>
#include <thread>

std::mutex mu;
std::condition_variable cv;
bool finished = false;

void threadFunc()
{
    for (int i = 0; i < 5; ++i)
    {
        std::this_thread::sleep_for(std::chrono::milliseconds(1));
        std::unique_lock<std::mutex> lock(mu);
        std:: cout << "Thread:  " << (0 - i) << "\n";
    }

    std::unique_lock<std::mutex> lock(mu);
    finished = true;
    cv.notify_one();
}

int main()
{
    {
        std::thread t1(threadFunc);
        t1.detach(); // Call `detach` to prevent blocking this thread

    } // Need to call `join` or `detach` before `thread` goes out of scope

    for (int i = 0; i < 5; ++i)
    {
        std::unique_lock<std::mutex> lock(mu);
        std::cout << "Main:  " << i << "\n";
    }

    std::cout << "End of Main\n";

    std::unique_lock<std::mutex> lock(mu);
    cv.wait(lock, [&finished]() { return finished; });

    return 0;
}

示例输出

Main:  0
Main:  1
Main:  2
Main:  3
Main:  4
End of Main
Thread:  0
Thread:  -1
Thread:  -2
Thread:  -3
Thread:  -4

Live Example

同样,以上是一个人为的示例,在您的情况下,在允许join返回之前,您可以更轻松地使用detach代替main。< / p>