【发布时间】: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数据所迷惑。最终缓冲区会填满,你会在一个大块中同时获得成百上千的“打印”。
标签: c++ multithreading sleep thread-sleep