是的,我可以在Windows中使用Sleep()或在POSIX中使用pause(),然后继续。 但是我如何只使用C ++ 11睡觉?我认为有一种方法,即使用std :: this_thread加入调用线程,但std :: this_thread没有与pthread函数不同的join()方法。 更不用说我们无法使用C ++ 11处理信号,我知道如何永久地迭代睡眠:
while(true)
std::this_thread::sleep_for(std::chrono::seconds(1));
然而,正如你所看到的,它根本不优雅。此代码仍然消耗CPU时间。调度程序必须关心此过程。我也可以使用条件变量或promise,但是它会占用一些内存或者在某些操作系统上不起作用(它会抛出异常以避免死锁)。
也许这可能相当于Windows的Sleep(INFINITE):
while(true)
std::this_thread::sleep_for(std::chrono::hours::max());
但很多人说这不切实际。
有人能想到出色的方式吗?
答案 0 :(得分:8)
我有两种方法可以想到。
@Guiroux提到的一个是sleep_until
一个不可到达的时间:
std::this_thread::sleep_until(std::chrono::system_clock::now() + std::chrono::hours(std::numeric_limits<int>::max()));
或让它无限期地等待一个永远不会实现的条件。
std::condition_variable cv;
std::mutex m;
std::unique_lock<std::mutex> lock(m);
cv.wait(lock, []{return false;});
但是我无法找到原因。
答案 1 :(得分:6)
另一种可能性:
std::promise<void>().get_future().wait();
或者如果您愿意:
std::promise<void> p;
p.get_future().wait();
答案 2 :(得分:2)
不是试图计算时间,为什么不睡到系统的最大可表示时间?
std::this_thread::sleep_until(std::chrono::time_point<std::chrono::system_clock>::max());
答案 3 :(得分:1)
我很期待听到为什么双重锁定非递归互斥锁是不好的,假设您确实确实想永远睡觉:
std::mutex m;
m.lock();
m.lock();
没有不必要的唤醒,终止协议仍然有效。
与使用std::promise<void>().get_future().wait();
相比,此方法创建的代码要少很多 。