我正在创建一个创建线程的简单程序,休眠20秒,然后终止线程。下面的代码编译,但无法在运行时睡眠和崩溃(运行所有cout行后)。我不确定出了什么问题,我试图尽可能地模仿其他主题(ha)。我应该使用不同的方法吗?使用Windows 10
#include "stdafx.h"
#include <iostream>
#include <thread>
#include <Windows.h>
using namespace std;
void t1(int x)
{
cout << "Child greeting!\n";
Sleep(20000);
cout << "Child terminating!\n";
std::terminate();
}
int main()
{
cout << "Parent greeting!\n";
thread first(t1,0);
cout << "Parent terminating!\n";
return 0;
}
答案 0 :(得分:8)
问题不在于你的睡眠(你真的应该使用std::this_thread::sleep_for()
),而是你的过程在线程结束之前结束。当main()
函数返回时会发生这种情况。
这意味着线程对象将处于无效状态destructed,导致std::terminate()
被调用,并且您的进程似乎崩溃。
您可以通过等待线程结束来轻松解决此问题。您使用std::thread::join()
方法执行的操作。
另一方面,你你自己在你的线程中调用std::terminate()
,所以即使你等待线程结束,你的程序仍会“崩溃”。
如果您希望线程结束,只需让t1()
函数以正常和常规的方式退出。
答案 1 :(得分:1)
将您的主要内容更改为:
int main()
{
cout << "Parent greeting!\n";
thread first(t1,0);
first.join(); // ADD THIS!!!
cout << "Parent terminating!\n";
return 0;
}
并从线程函数中删除终止调用。
void t1(int x)
{
cout << "Child greeting!\n";
Sleep(20000);
cout << "Child terminating!\n";
// REMOVE THIS!!! std::terminate();
}