16

pthread_exitから呼び出すmainと、プログラムが終了しません。プログラムの唯一のスレッドを終了していたので、プログラムが終了することを期待していましたが、機能しません。ハングしたようです。

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>

int main(int argc, char *argv[])
{
    printf("-one-\n");

    pthread_exit(NULL);

    printf("-two-\n");
}

Process Explorerは、(唯一の) スレッドがWait:DelayExecution状態にあることを示しています。

ドキュメントによるとpthread_exit

最後のスレッドが終了した後、プロセスは終了ステータス 0 で終了します。動作は、実装がスレッド終了時に引数なしで exit() を呼び出したかのようになります。

私はDev-C++ v4.9.9.2pthreads-win32 v2.8.0.0を使用しています(へのリンクlibpthreadGC2.a)。

ライブラリは問題ないようです (たとえば、callingpthread_selfまたはpthread_createfromは正常にmain動作します)。

pthread_exitから電話してはいけない理由はありますmainか?

4

4 に答える 4

18

pthreadsのLinux実装では間違いなく合法です。 pthreads_exitのメモセクションを参照してください。それは述べています

他のスレッドが実行を継続できるようにするには、メインスレッドは exit(3) ではなく pthread_exit() を呼び出して終了する必要があります。

さらに、ここのソース コード(末尾に向かって) を見ると、大まかに _endthread または _endthreadex に変換されていることがわかります。これらのドキュメントは、最初のスレッドでそれを呼び出さないことについて言及していません

于 2010-08-24T18:42:49.530 に答える
15

これは完全に合法で意図された動作です。プロセス全体は、すべてのスレッドが終了するか、exit明示的または暗黙的に呼び出されたときにのみ終了します。

からの通常のリターンmainは、 への呼び出しと同等exitです。で終了mainする場合pthread_exitは、他のスレッドを続行することを明示的に言っています。

于 2010-08-24T19:42:49.020 に答える