web-dev-qa-db-ja.com

Sleep()とsleep_for()の比較

誰かがこれらの2つのスレッド停止方法の動作の違いを説明してから、再度スレッドを続行できますか?.

Sleep(); //from Win32

std::this_thread::sleep_for();

私はマルチスレッド動作の用語でシステム互換性ではないことに言及します。

6
EduardoG

違いは、sleep_for()はC++ 11標準で定義されており、Sleep()はWindows APIで定義されていることです。 sleep_for()を使用する場合、Windows向けにコンパイルするときに、コンパイラはSleep()を呼び出すコードを生成する可能性があります。ただし、これはC++ 11標準関数であるため、C++ 11標準を(正しく)実装しているコンパイラーは、 function forそれがサポートするすべてのプラットフォーム。

その他の主な違いは、sleep_for()がミリ秒単位の整数ではなくstd::chrono::durationをパラメーターとして使用することです。これにより、スレッドをスリープさせる時間をより簡単かつ正確に指定できます。また、一部のドキュメント情報を型システムに移動します。

マルチスレッドのsleep_for()Sleep()の関係を知りたいと思っていましたが、sleep_for()にはC++ 11標準で定義されている意味があり、Sleep()にはWindows APIで定義されている意味があります。そして、参照をチェックすると、それぞれがitsそれぞれのスレッドタイプについて話します。したがって、C++ 11スレッドを使用している場合は、sleep_for()を使用します。 Win32スレッドを直接使用している場合は、Sleep()を使用します。 Sleep()にはC++ 11スレッドの概念がないため、動作が明確に定義されていません。同様に、sleep_for()にはWindows APIスレッドの概念がないため、動作も明確に定義されていません。各関数のドキュメントには、それぞれのスレッドとの相互作用が明記されています。標準を混在させないでください。

7
Mikaela Szekely

以下のようなsleepメソッドを呼び出すと、sleep()関数/メソッドへのパラメーターとして指定された特定のタイムスライスのスレッドを中断するようにO/Sに指示します。この関数がO/Sを実行したら、そのスレッドを一時的に停止し、スリープ状態にします。そのようにすることで、O/Sはマイクロプロセッサを(スリープ状態のスレッドから)解放するため、プロセッサ時間を待っている別のスレッドまたはプロセスにプロセッサを割り当てることができます。 2つの間に大きな違いはありません。 Sleep()はWindows用であり、Windowsヘッダーファイルを追加する必要があります<windows>および次のものは、WindowsとUnix環境の両方で使用でき、ヘッダーファイルを使用する必要があります<chrono>

 Sleep(); //from Win32
 std::this_thread::sleep_for();

次のように両方のスリープ機能を使用できます:-

 Sleep(100); //sleep for 100 m/s but only in windows    
 std::this_thread::sleep_for(std::chrono::milliseconds(100));//sleep for 100 m/s. Can be use in both windows and Unix environment

100 m/sの後、O/Sはスリープ状態のスレッドをウェイクアップし、その後の実行と操作のためにプロセッサをスレッドに再度割り当てます。