在我的代码中,我希望系统进入睡眠状态,直到满足条件为止。经过一番搜索,我发现了#include <unistd.h>
,但对我来说,它看起来一直处于休眠状态,直到达到时间范围为止。我想知道是否有一种简单的方法可以让程序等到条件达到为止。
在这里,您有一个代码示例来阐明我的观点
bool check() {
while (condition) {
sleep.here();
} else {
run.the.rest();
}
}
答案 0 :(得分:1)
根据您不完整的伪代码和描述,这是一个类contidion_t
,您可以在其中通过set_condition
设置条件,并且loop
中的线程阻塞将被唤醒,每次设置它。
#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
#include <atomic>
struct condition_t {
public:
template <typename T>
void loop(T the_rest) {
while(running) {
std::unique_lock<std::mutex> lock_guard(m);
cv.wait(lock_guard, [this] { return ready.load(); });
the_rest();
ready = false;
}
}
void set_condition(bool value) {
ready = value;
if (value) {
cv.notify_one();
}
}
void stop_running() {
running = false;
ready = true;
cv.notify_all();
}
~condition_t () {stop_running();}
private:
std::mutex m;
std::condition_variable cv;
std::atomic<bool> ready{false};
std::atomic<bool> running{true};
};
int main() {
condition_t condition;
std::thread thread(&condition_t::loop<void (void)>, &condition, [] () {
std::cout << "Doing the rest" << std::endl;
});
std::cout << "Thread created but waits\nInput something for continue:";
int something;
std::cin >> something;
std::cout << "Continueing\n";
condition.set_condition(true);
std::cout << "Input something to stop running:";
std::cin >> something;
condition.stop_running();
thread.join();
}