退出此while
循环的最简单方法是什么?
是否有某种功能可以检测睡眠时值是否为真?
或者我在循环中设置一个小睡眠并检查退出,如果不再睡觉?如果是这样我该怎么做?
std::atomic<bool> _execute;
while (_execute.load(std::memory_order_acquire))
{
//do stuff
//How to exit druing this long sleep
std::this_thread::sleep_for(std::chrono::minutes(_Delay));
}
答案 0 :(得分:10)
是否有某种功能可以检测睡眠时值是否为真?
没有这种方法可以在同一个线程中打破std::this_thread::sleep_for()
调用。该线程暂停或多于或少于std::chrono::duration
参数中指定的时间。
什么是最简单的方法退出这个While循环而它还在睡觉? 或者我在循环中设置一个小睡眠并检查退出,如果不再睡觉?如果是这样我该怎么做?
不要让它睡觉(那么久)。
而不是sleep_for()
您可以使用条件变量和wait_for()
来发出信号以退出循环(来自另一个线程)。
正如您在comment中澄清的那样,您应该重新组织代码(再次使用条件变量),而不是使用std::atomic<bool>
:
#include <iostream>
#include <chrono>
#include <thread>
#include <condition_variable>
#include <mutex>
const std::chrono::seconds MainDelay = std::chrono::seconds(5);
const std::chrono::seconds WorkerTimeResolution = std::chrono::seconds(2);
std::mutex cv_m;
std::condition_variable cv;
bool _execute = false;
void worker_thread() {
std::unique_lock<std::mutex> lk(cv_m);
while (cv.wait_for(lk,WorkerTimeResolution,[](){return _execute ;})) {
// do stuff as long _execute is true,
// may be with more varying timing conditions than sleep_for() ...
std::cout << "Worker thread executing ..." << std::endl;
std::this_thread::sleep_for(WorkerTimeResolution);
}
}
int main() {
std::thread t(worker_thread);
_execute = true;
cv.notify_all();
for(int i = 0; i < 3; ++i) {
// Do other stuff, may be with more varying timing conditions ...
std::this_thread::sleep_for(MainDelay);
std::cout << "Main thread executing ..." << std::endl;
}
_execute = false;
cv.notify_all();
t.join();
}
请注意,有许多可能的操作而不是std::this_thread::sleep_for()
,可能会在
// Do stuff ...
并导致当前线程被暂停。
答案 1 :(得分:3)
您编写的代码实际上对 x 分钟无效;现在你想要它在那段时间做事情(检查一个条件)。你不能双管齐下!
将<{1>}替换为等待条件变量。