如何只使用C ++ 11

时间:2016-04-19 07:15:50

标签: c++11

是的,我可以在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());

但很多人说这不切实际。

有人能想到出色的方式吗?

4 个答案:

答案 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();相比,此方法创建的代码要少很多