join()
とdetach()
の違いはC++のマルチスレッドですか? join()
はスレッドを強制終了しますか?C++でのマルチスレッドのjoin()とdetach()の違いは何ですか?
答えて
C++ thread
オブジェクト(常にではない)は、OSまたはプラットフォームの概念であり、実行のスレッドを表します。
thread::join()
が呼び出されると、呼び出しスレッドは実行スレッドが完了するまでブロックされます。基本的に、これはスレッドが終了したときを知るために使用できる1つのメカニズムです。 thread::join()
が返されると、実行のOSスレッドが完了し、C++ thread
オブジェクトが破棄される可能性があります。
thread::detach()
が呼び出され、実行スレッドがthread
オブジェクトから「切り離され」、もはやthread
オブジェクトで表されなくなりました。それらは2つの独立したものです。 C++ thread
オブジェクトは破棄され、実行のOSスレッドは継続できます。プログラムがその実行スレッドがいつ完了したかを知る必要がある場合、他の何らかのメカニズムを使用する必要があります。 join()
は、そのthread
オブジェクトではもはや呼び出すことができません。これはもはや実行スレッドに関連付けられていないからです。
C++ thread
オブジェクトをまだ「結合可能」にしている間は、そのオブジェクトを破壊するとエラーが発生したとみなされます。つまり、C++ thread
オブジェクトを破棄するには、join()
を呼び出す(そして完了させる)必要があります。またはdetach()
を呼び出す必要があります。 C++ thread
オブジェクトが破棄されても結合可能である場合、例外がスローされます。
C++ thread
オブジェクトが実行スレッドを表しています(つまり、join不可能することができます。)いくつかの他の方法:
- デフォルトは
thread
オブジェクトではありませんので、実行のスレッドを表すものではありません構築しました参加可能。 - 移動元のスレッドは実行スレッドを表さないため、結合できません。
join()
スレッドを強制終了しません。実際には、スレッドのメイン関数が返るまで待機します。もしそうなら、あなたのスレッド主な機能は次のようになります。
while (true) {
}
join()
detatch()
もスレッドを強制終了しません。実際にはstd::thread
には、std::thread
オブジェクトが破棄されてもこのスレッドが実行され続けると伝えられます。 C++はstd :: threadデストラクタをチェックして、スレッドがジョインまたはデタッチされていることを確認し、このチェックが失敗した場合にはプログラムを終了します。
したがって、次のコードのmain
機能の最初の行のコメントを外すと、クラッシュします。 2行目または3行目のコメントを外してもOKです。一般
#include <thread>
void func() {
}
void fail1() {
std::thread t(func);
// will fail when we try to destroy t since it is not joined or detached
}
void works1() {
std::thread t(func);
t.join();
}
void works2() {
std::thread t(func);
t.detach();
}
int main() {
// fail1();
// works1();
// works2();
}
- 1. このWHERE句とこのJoinの違いは何ですか?
- 2. PIGのCogroupとJoinの違いは何ですか?
- 3. oracle sqlのjoinキーワードとinner joinキーワードの違いは何ですか?
- 4. JOINステートメントとJOINステートメントがないステートメントの違いは何ですか?
- 5. 時間マルチスレッドとスーパースレッドの違いは何ですか?
- 6. `FROM _、_`と `FROM _ INNER JOIN _ ON _`の違いは何ですか?
- 7. CとC++での "const"の違いは何ですか?
- 8. LEFT、RIGHT、INNER、OUTER JOINの違いは何ですか?
- 9. jtype(JNIの)とC/C++のタイプの違いは何ですか?
- 10. C/C++のrand、urandとirandの違いは何ですか?
- 11. FragmentTransaction内のadd()。addToBackStack()、add()。detach()およびreplace()。addToBackStack()との違いは何ですか?
- 12. C++の "new"と "malloc"と "calloc"の違いは何ですか?
- 13. 「Cシステムコール」と「Cライブラリルーチン」の違いは何ですか?
- 14. "C#editor"と "C#editor with encoding"の違いは何ですか?
- 15. Cの中のpopen()とsystem()の違いは何ですか
- 16. C++でsetとunordered_setの違いは何ですか?
- 17. C#でInt64とlongの違いは何ですか?
- 18. cでopenとcreatシステムコールの違いは何ですか?
- 19. C++でthis-> dataと(* this).dataの違いは何ですか?
- 20. Cのint * ptrとint * ptrの違いは何ですか?
- 21. C#のArrayListとHashtableの違いは何ですか?
- 22. JavaとC++のイテレータの違いは何ですか?
- 23. Objective-Cの "_"と "__"の違いは何ですか?
- 24. -Cとmysqldumpのgzippingの違いは何ですか?
- 25. C#のオブジェクトとクラスの違いは何ですか?
- 26. Objective Cのメソッドと+メソッドの違いは何ですか?
- 27. objective-cの[myString length]とmyString.lengthの違いは何ですか?
- 28. Obj-Cのself.xxxとcalling xxxの違いは何ですか?
- 29. C#の `new object()`と `new {}`の違いは何ですか?
- 30. Objective-CのinstancesRespondToSelectorとrespondsToSelectorの違いは何ですか?