2

私にはマルチスレッドの概念がはじまりました。参加する前にスレッドが終了している理由は不思議でした。彼らは私のpthreadに到達する前に基本的に、私は、プロセスIDのグローバルリストを維持しています、私は今問題がある参加する前にスレッドが終了する

if(pthread_create(&thread_id[i], NULL, function_to_execute, NULL)) { 
     fprintf(stderr, "error thread not created\n"); 
    } 

を呼び出すことによって、反復的にそれらを作成し、すべての私のスレッドが出ている

pthread_join(thread_id[i], NULL); 

いるに参加スレッドが作成された直後に呼び出される関数呼び出しに深くネストされています。私はいくつかのロックや何かをするかどうか分からない、またはスレッドが終了する前にjoinステートメントまで待つように追加のコマンドを追加する。

+0

'function_to_execute'に依存します。たぶんそれは例外をスローしますか?そして、彼らが「参加」に達する前に退会していることをどのように伝えることができますか?多分無限ループや何かにいるかもしれません – AhmadWabbi

+6

あなたが 'pthread_join()'と一緒にいるスレッドが既に終了している場合は問題ありません。この場合、 'pthread_join()'が直ちに返りますが、それ以外の場合は待たなければなりません。 *しかし*:あなたは既に 'pthread_join()'や 'pthread_detach()'されたスレッドで 'pthread_join()'しようとしてはいけません。 – EOF

+0

非常に良いスレッドチュートリアル:https://computing.llnl.gov/tutorials/pthreads/ – yano

答えて

2

ドキュメントPOSIXから:ターゲットスレッド がすでに終了している場合を除き、対象スレッドが、終了するまではpthread_join()関数は、呼び出した スレッドの実行を中止しなければならない

。成功したpthread_join() 呼び出しからNULLでないvalue_ptr引き数を返した場合、終了スレッドによって pthread_exit()に渡された値は、 でvalue_ptrで参照されるようになります。 pthread_join()が を正常に返すと、ターゲットスレッドは終了しています。同じ ターゲットスレッドを指定するpthread_join()への複数の同時呼び出しは、定義されていません。 pthread_join()を呼び出すスレッドが である場合、そのスレッドはデタッチされてはならない。

上記の要件を満たしている限り、追加の措置は必要ありません。

0

終了ステータスがpthread_join()によって要求される前にスレッドが終了していると、なぜそれが問題になるのか完全にはわかりませんか?

これは完全に正常です。

pthread_create()は、指定された関数で新しいスレッドを開始します。この機能はすぐに実行され、スタータースレッドよりも優先されることもあります。スレッドには、独自のローカル変数(スタック)とスレッドローカル変数があります。他のすべての共用メモリへのアクセスは調整されなければならないか、データ競合が発生します。通常、共有データはmutexによって保護されます。スレッドは、何らかの同期操作によってブロックされるか、またはスレッドがその開始機能を終了するまで、(通常は他のスレッドと並行して)実行を継続します。

他のスレッドがpthread_join()を実行して実行を完了するのを待つことができます。 usrのように、pthread_join()はスレッドがすでに終了していれば待機しません。

関連する問題