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

たとえば、Windowsの場合、SuspendThreadおよびResumeThread

しかし、もっと重要なのは、これを行う必要がほとんどないということです。通常、標準では提供されていない基本的なものに遭遇した場合、それは危険な設計パスに向かっていることを示す危険信号です。別の方法でより大きな目標を達成することを検討してください。

于 2012-10-12T13:01:47.920 に答える
11

いいえ、標準はそのような機能を提供していませんし、そうすべきではありません。睡眠は何をしますか?少なくとも指定された時間、指定されたスレッドの実行を一時停止します。他のスレッドは、より良いパフォーマンスを達成するために特定のスレッドをスリープ状態にできることを同期せずに知ることができますか?

いいえ。同期されたインターフェイスを提供する必要があります。これにより、スレッドによるパフォーマンスの向上が妨げられます。スリープしてもよいかどうかについて必要な情報を持っている唯一のスレッドは、スレッド自体です。したがってstd::thread、メンバーはありませんが、メンバーsleepはありstd::this_threadます。

于 2012-10-12T12:59:52.360 に答える