2016-08-09 6 views
1

C++ 11スレッドには奇妙な問題があります。 残念ながら、(複雑さを考えれば)完全な例を貼り付けることができず、簡単な例で問題を再現することはできません。C++ 11スレッドはjoinableですが、join()は例外を発生させます

したがって、問題は私が実行しているスレッドがあることです(また、joinでもdetachも呼び出されています)。 ある時点で、別のスレッドがこのスレッドを停止しようとしています。実装はブール変数をfalseに設定し、joinを呼び出してスレッド終了を待ちます。

まあ、問題は、結合です。 現在のスレッド(結合を呼び出す)が結合されたスレッドと異なっており、joinable()がtrueを返すことを確認しました。 それにもかかわらず、この例外が発生します。これは、MacOSの10.11に起こるが、私は私の同僚は、Linux上でそれをテストし、それが発生しませんでした

libc++abi.dylib: terminating with uncaught exception of type std::__1::system_error: thread::join failed: No such process 

ヒント?

+0

あなたはコードが複雑だと言っていますが、 'join'は他のどこかで呼び出されていませんか?より多くのデバッグログとトレースを追加して、何が起きているかを確認してください。 –

+0

@JoachimPileborgは、スレッドがすでに結合されている場合、 'joinable'''' false'を返しますか? – Francesco

+2

真実なので、間違っているかもしれない。 MCVEでそれを複製することはできないので、何も言うことは本当に不可能ですが、問題はあなたのコードであり、標準ライブラリではない可能性が高いです。 [Valgrind](http://valgrind.org/)などのメモリデバッガを使用して、実行しないでください。また、デバッガでコードをステップ実行するのが難しい場合は、デバッグ/トレースのロギングも有効です。 –

答えて

2

親プロセスで追加のスレッドを作成した後にfork()を呼び出すと、この問題が発生する可能性があります。子プロセスが親プロセスと異なる重要な点の1つは、子プロセスにスレッドが1つしかないことです。

スレッドがあると思うすべてのC++コードはだまされ、join()は "No such process"をスローします。この場合、ネイティブコールはESRCHを返します。

fork()を呼び出す前にスレッドを作成しないでください。

+1

または(私が望む)新しく作成されたプロセスでは、以前のすべてのスレッドが存在しないと考えます。ところで、フォークとマルチスレッドはどこにせよ落胆しています。(例:http://www.linuxprogrammingblog.com/threads-and-fork-think-twice-before-using-them) – Francesco

関連する問題