我试图每 5 秒运行一次 run() 函数,而不停止 while() 循环(并行)。我怎样才能做到这一点 ?提前致谢
#include <iostream>
#include <thread>
#include <chrono>
using namespace std;
void run()
{
this_thread::sleep_for(chrono::milliseconds(5000));
cout << "good morning" << endl;
}
int main()
{
thread t1(run);
t1.detach();
while(1)
{
cout << "hello" << endl;
this_thread::sleep_for(chrono::milliseconds(500));
}
return 0;
}
最佳答案
在您的 main
中函数,了解每个线程在做什么很重要。
- 主线程创建一个
std::thread
叫t1
- 主线程继续并分离线程
- 主线程执行你的
while
循环其中:- 打印你好
- 休眠 0.5 秒
- 主线程返回0,程序结束。
从第 1 点开始的任何时间,线程 t1
sleep 5 秒,然后打印早上好。这种情况只会发生一次!另外,正如@Fareanor指出的,std::cout
不是线程安全的,所以用主线程和线程访问它 t1
可能会导致数据竞争。
当主线程到达第 4 点时(实际上永远不会这样做,因为您的 while
循环是无限的),您的线程 t1
可能已经完成了任务,也可能没有完成。想象一下可能发生的潜在问题。在 most of the cases ,您需要使用 std::thread::join()
.
为了解决您的问题,有多种选择。下面,我们假设函数run
的执行没有 std::this_thread::sleep_for
根据 @Landstalker 的评论,与 5 秒相比微不足道。 run
的执行时间然后将是 5 秒加上一些微不足道的时间。
按照评论中的建议,不要执行函数run
每 5 秒,您可以简单地执行 run
的主体每 5 秒放置一个 while
在该函数内部循环:
void run()
{
while (true)
{
std::this_thread::sleep_for(std::chrono::milliseconds(5000));
std::cout << "good morning" << std::endl;
}
}
int main()
{
std::thread t(run);
t.join();
return 0;
}
如果由于某种原因,您确实需要执行run
正如问题中所述,每 5 秒运行一次函数,您可以启动一个包装函数或 lambda,其中包含 while
循环:
void run()
{
std::this_thread::sleep_for(std::chrono::milliseconds(5000));
std::cout << "good morning" << std::endl;
}
int main()
{
auto exec_run = [](){ while (true) run(); };
std::thread t(exec_run);
t.join();
return 0;
}
作为旁注,最好 avoid using namespace std
.
关于C++ 每 x 秒调用一个函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60163449/