C++11 如何只使用C++;11

C++11 如何只使用C++;11,c++11,C++11,是的,我可以在Windows中使用Sleep()或在POSIX中使用pause(),然后继续。 但是我如何只使用C++11睡觉呢?我认为有一种方法,就是使用std::this_线程连接调用线程,但是std::this_线程与pthread函数不同,没有join()方法。 更不用说我们不能用C++11处理信号,我知道如何像下面这样迭代睡眠: while(true) std::this_thread::sleep_for(std::chrono::seconds(1)); 然而,正如你所看到

是的,我可以在Windows中使用Sleep()或在POSIX中使用pause(),然后继续。 但是我如何只使用C++11睡觉呢?我认为有一种方法,就是使用std::this_线程连接调用线程,但是std::this_线程与pthread函数不同,没有join()方法。 更不用说我们不能用C++11处理信号,我知道如何像下面这样迭代睡眠:

while(true)
   std::this_thread::sleep_for(std::chrono::seconds(1));
然而,正如你所看到的,它一点也不优雅。此代码仍然会占用CPU时间。调度程序必须关注此进程。我也可以使用条件变量或promise,但它会占用一些内存,或者在某些操作系统上不起作用(它会抛出异常以避免死锁)

也许这相当于Windows的睡眠(无限):

while(true)
   std::this_thread::sleep_for(std::chrono::hours::max());
但很多人说这不实际


有谁能想出绝妙的方法吗?

我可以想出两种方法

@Guiroux提到的一个方法是
sleep\u,直到到达不可到达的时间:

std::this_thread::sleep_until(std::chrono::system_clock::now() + std::chrono::hours(std::numeric_limits<int>::max()));
std::this_thread::sleep_until(std::chrono::system_clock::now()+std::chrono::hours(std::numeric_limits::max());
或者让它无限期地等待一个永远不会实现的条件

std::condition_variable cv;
std::mutex m;
std::unique_lock<std::mutex> lock(m);
cv.wait(lock, []{return false;});
std::条件变量cv;
std::互斥m;
标准:唯一锁(m);
wait(lock,[{return false;});

但是我看不出原因。

与其尝试计算时间,为什么不在系统可表示的最大时间之前睡眠呢

std::this_thread::sleep_until(std::chrono::time_point<std::chrono::system_clock>::max());
std::this_thread::sleep_until(std::chrono::time_point::max());
另一种可能性:

std::promise<void>().get_future().wait();
std::promise().get_future().wait();
或者,如果您愿意:

std::promise<void> p;
p.get_future().wait();
std::promise p;
p、 获取未来()等待();

我很期待听到为什么简单地双重锁定非递归互斥锁是不好的,假设你真的想永远睡觉:

std::mutex m;
m.lock();
m.lock();
没有不必要的唤醒,终止协议仍然有效。
这比使用
std::promise().get_future().wait()创建的代码要少得多

sleep\u直到无法到达的时间对我来说似乎更符合逻辑,因为
永远睡眠
可以在锁定的互斥锁上进行阻止?为什么需要这样做?这感觉像是一个XY问题…没有理由在标准中提供这样的ting,因为标准没有提供任何中断无限睡眠的东西(例如信号)。如果您担心(真正的)睡眠(1)
解决方案时
的CPU使用率,只需将
1
更改为
86400
。每天醒来几毫秒应该不会太繁重。将最大限制小时数添加到
now()
是否会导致参数类型溢出,从而为
睡眠时间指定过去的
时间点
?这个场景是针对gcc讨论的,我只是用它来在将来创建一个非常大的数字。当然,但是由于您将这个大数字添加到
now()
,我想知道这个总和是否会溢出、环绕,并导致一个实际的
时间点
,该时间点在
now()之前
。现在当然可以了,但是要多久才能
now()
变得太大,如果有的话?:-)(提示:数学是微不足道的,但我现在跑了,不能真正在我的头脑中做):-这在Visual C++ 2017上失败了。它似乎在某个地方溢出了。@isanae:std::this_thread::sleep_for(std::chrono::system_clock::duration::max())呢?(VS2015将此转换为调用sleep_until()-VS2017吗?)不
sleep\u for()
转发到
sleep\u until()
,通过将
时间点添加到溢出的
now()
,将其转换为绝对时间。我认为这根本不是办法。等待格雷厄姆答案中的条件变量似乎是最好的解决方案。这似乎是VisualC++中的一个缺陷。它在libstdc++和libc++上运行良好。双重锁定非递归互斥锁会导致未定义的行为。谢谢,这实际上是一个很好的观点。然而,事实并非如此。@Arsen Zahray-仍然是UB。见项目(3)。