繁体   English   中英

如何在C ++中sleep()线程

[英]How to sleep() a thread in 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;
    }

问题不在于睡眠(您实际上应该使用std::this_thread::sleep_for() ),而是您的进程在线程结束之前结束。 main()函数返回时会发生这种情况。

这意味着线程对象将在无效状态下被破坏 ,从而导致std::terminate()被调用,并且您的进程似乎崩溃了。

您可以通过等待线程结束来轻松解决此问题。 使用std::thread::join()方法执行的操作。

另一方面,您自己在线程中调用std::terminate() ,因此,即使您等待线程结束,程序仍将“崩溃”。

如果希望线程结束,只需让t1()函数退出常规方式即可。

将您的主要更改为:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM