是的,我可以在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));
Run Code Online (Sandbox Code Playgroud)
但是,正如你所看到的,它根本不优雅.此代码仍然消耗CPU时间.调度程序必须关心此过程.我也可以使用条件变量或promise,但是它再次占用一些内存或者不能在某些操作系统上工作(它会抛出异常以避免死锁).
也许这可能相当于Windows的Sleep(INFINITE):
while(true)
std::this_thread::sleep_for(std::chrono::hours::max());
Run Code Online (Sandbox Code Playgroud)
但许多人说这不实用.
谁能想到出色的方式?
我有两种方式可以想到.
其中一个@Guiroux提到的是sleep_until一个不可达的时间:
std::this_thread::sleep_until(std::chrono::system_clock::now() + std::chrono::hours(std::numeric_limits<int>::max()));
Run Code Online (Sandbox Code Playgroud)
或者让它无限期地等待一个永远不会实现的条件.
std::condition_variable cv;
std::mutex m;
std::unique_lock<std::mutex> lock(m);
cv.wait(lock, []{return false;});
Run Code Online (Sandbox Code Playgroud)
但是我看不出这个原因.
另一种可能性
std::promise<void>().get_future().wait();
Run Code Online (Sandbox Code Playgroud)
或者如果您愿意:
std::promise<void> p;
p.get_future().wait();
Run Code Online (Sandbox Code Playgroud)