gpt4 book ai didi

c++ - 正确使用 std::condition_variable 触发定时执行

转载 作者:行者123 更新时间:2023-11-27 22:45:32 25 4
gpt4 key购买 nike

我试图以固定的时间间隔执行一段代码。我有一些基于裸 pthread 的东西,现在我想使用 std::thread 做同样的事情。

#include <thread>
#include <mutex>
#include <condition_variable>
#include <iostream>

bool running;
std::mutex mutex;
std::condition_variable cond;

void timer(){
while(running) {
std::this_thread::sleep_for(std::chrono::milliseconds(1000));
std::lock_guard<std::mutex> guard(mutex);
cond.notify_one();
}
cond.notify_one();
}

void worker(){
while(running){
std::unique_lock<std::mutex> mlock(mutex);
cond.wait(mlock);
std::cout << "Hello World" << std::endl;
//... do something that takes a variable amount of time ...//
}
}

int main(){
running = true;
auto t_work = std::thread(worker);
auto t_time = std::thread(timer);
std::this_thread::sleep_for(std::chrono::milliseconds(10000));

running = false;
t_time.join();
t_work.join();
}

worker 实际上会做一些需要花费可变时间的事情,但它应该以固定的时间间隔进行调度。它似乎有效,但我对此很陌生,所以有些事情对我来说还不清楚......

  • 为什么我需要一个mutex?我并没有真正使用条件,但是每当 timer 发送信号时,worker 就应该完成它的工作。

  • timer 真的需要在循环后再次调用 cond.notify_one() 吗?这是从旧代码中提取的,iirc 的原因是为了防止 worker 永远等待,以防 timer 完成而 worker还在等。

  • 我是否需要 running 标志,或者是否有更好的方法break 跳出循环?

PS:我知道还有其他方法可以确保固定的时间间隔,而且我知道我目前的方法存在一些问题(例如,如果 worker 需要比使用的时间间隔更多的时间计时器)。但是,我想先了解那段代码,然后再对其进行过多更改。

最佳答案

Why do I need a mutex at all? I do not really use a condition, but whenever the timer sends a signal, the worker should do its job.

您需要互斥量的原因是等待条件被满足的线程可能会被虚假唤醒。为了确保您的线程确实收到了条件已正确满足的通知,您需要检查并应该在 wait 调用中使用 lambda 进行检查。并且为了保证变量在虚假唤醒之后不被修改,但在您检查变量之前,您需要获取一个互斥锁,这样您的线程是唯一可以修改条件的线程。在您的情况下,这意味着您需要为工作线程添加一种方法来实际验证计时器是否用完。

Does the timer really need to call cond.notify_one() again after the loop? This was taken from the older code and iirc the reasoning is to prevent the worker to wait forever, in case the timer finishes while the worker is still waiting.

如果您在循环后不调用通知,工作线程将无限期地等待。因此,要干净地退出您的程序,您实际上应该调用 notify_all() 以确保每个等待条件变量的线程都被唤醒并可以干净地终止。

Do I need the running flag, or is there a nicer way to break out of the loops?

运行标志是完成您想要的最简洁的方法。

关于c++ - 正确使用 std::condition_variable 触发定时执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43495020/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com