我编写了以下代码,但我无法理解为什么它不会像在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
答案 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
同样,以上是一个人为的示例,在您的情况下,在允许join
返回之前,您可以更轻松地使用detach
代替main
。< / p>