首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何只使用C++11就能永远睡眠

如何只使用C++11就能永远睡眠
EN

Stack Overflow用户
提问于 2016-04-19 15:15:50
回答 4查看 8.6K关注 0票数 11

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

代码语言:javascript
复制
while(true)
   std::this_thread::sleep_for(std::chrono::seconds(1));

但是,正如您所看到的,它一点也不优雅。此代码仍会消耗CPU时间。调度器必须处理这个进程。我也可以使用条件变量或promise,但是它会占用一些内存,或者在某些操作系统上不能工作(它会抛出一个异常来避免死锁)。

也许这可以等同于Windows的睡眠(无限):

代码语言:javascript
复制
while(true)
   std::this_thread::sleep_for(std::chrono::hours::max());

但许多人说这是不实际的。

有没有人能想出绝妙的办法?

EN

回答 4

Stack Overflow用户

发布于 2016-04-19 15:41:37

我能想到两种方法。

一个,@Guiroux提到的是sleep_until一个不可达的时间:

代码语言:javascript
复制
std::this_thread::sleep_until(std::chrono::system_clock::now() + std::chrono::hours(std::numeric_limits<int>::max()));

或者让它无限期地等待一个永远不会满足的条件。

代码语言:javascript
复制
std::condition_variable cv;
std::mutex m;
std::unique_lock<std::mutex> lock(m);
cv.wait(lock, []{return false;});

然而,我看不出这是什么原因。

票数 12
EN

Stack Overflow用户

发布于 2017-03-07 17:23:58

另一种可能性是:

代码语言:javascript
复制
std::promise<void>().get_future().wait();

或者,如果您愿意:

代码语言:javascript
复制
std::promise<void> p;
p.get_future().wait();
票数 10
EN

Stack Overflow用户

发布于 2016-10-04 15:45:36

与其尝试计算时间,为什么不睡觉,直到系统的最大可表示时间?

代码语言:javascript
复制
std::this_thread::sleep_until(std::chrono::time_point<std::chrono::system_clock>::max());
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36711131

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档