gpt4 book ai didi

c++ - 如何在循环线程中使用 wait_for?

转载 作者:行者123 更新时间:2023-12-02 02:01:16 27 4
gpt4 key购买 nike

我想要一个线程 (std::thread) 每 60 秒完成一次工作,否则休眠并在外部请求时立即返回。std::jthread 不是一个选项,我仅限于 C++14。

std::condition_variable cv;

//Thread1:
void ThreadWork
{
while(cv.wait_for(someLock, 60s) == std::cv_status_timeout)
{
Work();
}
return;
}

//Thread2:
void RequestEnd()
{
cv.notify_one();
}

这里的想法是,如果返回值是 std::cv_status_timeout,则 60 秒已经过去,我们将正常进行工作。否则返回。

目前,我从运行时收到一些关于锁的投诉,或者直接投诉 std::terminate

用循环检查原子变量做一些技巧不是我想要的;这是关于线程休眠。

至少我的方向是正确的吗?

最佳答案

由于虚假唤醒,在没有其他条件的情况下使用 condition_variable 是错误的。您至少需要一个 bool 变量。

someLock 应该保护其他条件,并且应该锁定到 wait_for

在一个线程中获取的锁之后应该在同一个线程中释放。 (通常,但并非总是如此,锁是堆栈变量)。

另外由于spurious wakes non-predicate wait_for使用起来不方便,需要重新计算timeout。首选谓词形式,并检查谓词中的条件。

关于c++ - 如何在循环线程中使用 wait_for?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68999989/

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