如何在C ++中睡眠()一个线程

时间:2018-02-13 02:52:15

标签: c++

我正在创建一个创建线程的简单程序,休眠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;
    }

2 个答案:

答案 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();
}