新线程导致问题 C++

Posted

技术标签:

【中文标题】新线程导致问题 C++【英文标题】:new thread causes issues c++ 【发布时间】:2021-05-13 11:50:36 【问题描述】:

我有一个 void 函数,其中有一个 while (true) 循环,Sleep();std::this_thread::sleep_for(std::chrono::milliseconds()); 什么都不做。是的,我知道我的睡眠时间是 毫秒 而不是秒,通过多线程我的意思是我已经完成了:

std::thread nThread(Void);
nThread.detach();

当我只是调用该方法时,不会出现这个问题,它睡得很好。

基本上我在做什么:

#include <stdio.h>
#include <thread>

void thisisVoid()

    while (true)
    
        printf("Print");
        std::this_thread::sleep_for(std::chrono::milliseconds(100));
    


int main()

    std::thread nThread(thisisVoid); 
    nThread.detach();

【问题讨论】:

你能发一个minimal reproducible example吗? 不相关:在许多系统上,睡眠一毫秒会令人失望。 std::this_thread::sleep_for 保证您等待至少那么久。底层系统将无法为您提供精确的滴答声,您可能会发现程序等待下一个滴答声等待 10 毫秒或更长时间。仔细测试,看看您通常的睡眠时间。 无关(可能):小心detach。您失去了对线程的控制,并且根据您在线程中所做的事情,您可能不希望它执行您的系统对可执行文件退出时孤立的线程所做的任何事情。 没有足够的信息来提供比概括更好的东西。当然没有足够的信息来帮助调试您的程序。我们至少需要一个minimal reproducible example。线程变得很奇怪,如果没有完整且可执行的不良行为示例和对所需行为的良好描述,我们将无法有效地提供帮助。 所展示的程序,一旦错别字被清除,将创建线程并在线程有机会启动之前退出。您需要进一步了解何时使用join 以及何时使用detach。简短的回答是您几乎总是使用join。如果您join,您可能会被正在缓冲的printf 数据所迷惑。最终缓冲区会填满,你会在一个大块中同时获得成百上千的“打印”。 【参考方案1】:

问题不在于睡眠。你并没有真正问过问题,但我认为你的意思是,如果你不分离,就会崩溃。

这就是为什么...

C++ 不希望您以悬空线程退出程序。您可以分离它们或加入它们。你的新线程有一个启动时间,如果你只是在底部退出 main,你的第一个线程可能还没有运行。因为你没有加入反对它或分离它,所以它没有被允许清理。

所以你必须在 main() 中做一个或另一个。如果你加入反对它,你会等到它完成。如果你分离它,你甚至可以在他被处决之前退出。

【讨论】:

所以无论哪种方式我都搞砸了 - 加入绝对不是我想要的,因为它是一个真正的循环,它不是一个暂时的假循环 @INeedHelp 你可能没有搞砸。有几百万程序员成功地用 C++ 编写了多线程程序。但是你还没有真正解释你真正的问题是什么。也许您应该编辑您的问题,提供更多关于您实际尝试完成的信息。

以上是关于新线程导致问题 C++的主要内容,如果未能解决你的问题,请参考以下文章

C++ boost线程在实例化两次时导致分段错误

std::thread,在线程中抛出异常会导致 Visual C++ 中的中止错误

检测何时将对象传递给 C++ 中的新线程?

在新窗口 C++ 中创建线程

如何在 C++ 中注册线程退出处理程序?

C++ std::async 不会产生新线程