7


4

メインスレッドでpthread_joinを呼び出すことは有効ですか?

このコードの動作は明確に定義されていますか?

#include
#include

pthread_t mt;

void *start(void *x)
{
    void *y;
    pthread_join(mt, &y);
    printf("joined main thread\n");
    return 0;
}

int main()
{
    pthread_t t;
    mt = pthread_self();
    pthread_create(&t, 0, start, 0);
    pthread_exit(0);
}

3 Answer


8


はい、これは可能です。 実際、この可能性は、 `pthread_detach()`が存在する主な理由の1つです。 `pthread_detach()`のPOSIXドキュメントから( `man pthread_detach`を参照):

   It  has  been suggested that a "detach" function is not necessary; the
   detachstate thread creation attribute is sufficient,  since  a  thread
   need  never  be dynamically detached. However, need arises in at least
   two cases:

    1. In a cancellation handler for a pthread_join() it is nearly essen-
       tial  to  have  a pthread_detach() function in order to detach the
       thread on which pthread_join() was waiting. Without it,  it  would
       be  necessary  to  have  the  handler do another pthread_join() to
       attempt to detach the thread, which would both delay the cancella-
       tion  processing  for an unbounded period and introduce a new call
       to pthread_join(), which might itself need a cancellation handler.
       A dynamic detach is nearly essential in this case.


    2. In  order  to  detach the "initial thread" (as may be desirable in
       processes that set up server threads).

したがって、あなたが提案していることは、標準に従ってうまくいきます。

*編集:*さらに確認するために、http://pubs.opengroup.org/onlinepubs/009695399/functions/exec.html [`exec()`のPOSIX記述]は次のように述べています。

_ 新しいプロセスイメージの初期スレッドは、detachstate属性をPTHREAD_CREATE_JOINABLEに設定して作成されたかのように、結合可能でなければなりません。 _


0


実世界のアプリケーションでこれを行う理由を想像することはできません(考えられる場合は、誰かが例をコメントしてください)が、それも可能だとは思いません。 私が調べたpthreadに関するすべての検索には、セカンダリスレッドではなく、メインスレッドから呼び出される結合が常にあります。

また、結合には、結合しようとしているスレッドがPTHREAD_CREATE_JOINABLEフラグを使用して作成されている必要があります。 メインスレッドがそのように作成されているかどうかを示すドキュメントを見つけることができませんでした。

Codeguruにも同様の質問があります。http://www.codeguru.com/forum/showthread.php?threadid = 497863 [こちら]

メインスレッドが終了した後も子スレッドを継続したい場合は、分離している子スレッドを作成するか、使用しているプラ​​ットフォームに応じて代わりに fork /` vfork`を使用する必要があります。


0


特に、「main」の最後で「pthread_exit」を実行しているので、あなたのアプローチは正式に有効に見えます。

一方、POSIXでは、 `main`の初期スレッドを結合可能にするかどうかの指示は見つかりませんでした。 psmearsの答えの理論的根拠は、 `main`が結合可能に作成された場合に、それが分離可能でなければならないことだけを要求しています。

また、他の悪意のあるものがmainなどで呼び出されるサブルーチンから `pthread_detach`を呼び出す場合があります。 そのため、このような場合をチェックするには、 `pthread_join`の戻り値を明確にチェックする必要があります。

また、サンプルコードでは、 start`の作成と main`の終了との間に競合があります。

  • 「main」は、「start」が「pthread_join」に到達する前に終了する場合があります

`mt`変数へのアクセスをミューテックスすることは、それを捕らえるはずです。