19

我是 std::thread 的新手。我需要让一个线程从另一个线程进入睡眠状态,这可能吗?在示例中,我看到的只是如下代码:

std::this_thread::sleep_for(std::chrono::seconds(1));

但我想做的是:

std::thread t([]{...});
t.sleep(std::chrono::seconds(1));

或者 sleep(t, std::chrono::seconds(1));

有任何想法吗?

4

2 回答 2

24

因为sleep_for是同步的,它只在当前线程中才真正有意义。您想要的是一种暂停/恢复其他线程的方法。该标准没有提供执行此操作的方法(afaik),但您可以使用依赖于平台的方法,使用native_handle.

例如在 WindowsSuspendThreadResumeThread.

但更重要的是,几乎没有必要这样做。通常,当您遇到标准未提供的您需要的基本内容时,这是一个危险信号,表明您正在走上一条危险的设计道路。考虑以不同的方式实现更大的目标。

于 2012-10-12T13:01:47.920 回答
11

不,标准没有给你这样的便利,也不应该。睡觉有什么作用?它至少在给定的时间内暂停给定线程的执行。其他线程是否可能在不同步的情况下知道给定线程可以进入睡眠状态以获得更好的性能?

不可以。您必须提供一个同步接口,这将抵消线程的性能增益。唯一具有所需信息的线程是否可以睡眠是线程本身。因此std::thread没有成员sleep,而std::this_thread有一个。

于 2012-10-12T12:59:52.360 回答