0

NULL関数の2番目の引数として渡すとpthread_create()、スレッドが結合可能になることをどこから知っているのかと尋ねられました。

つまり、manページにそのように記載されていることは知っていますが、コードの正当化が要求されました。NULL渡されると、デフォルトの属性が使用されることを知っています。

const struct pthread_attr *iattr = (struct pthread_attr *) attr; if (iattr == NULL) /* Is this the best idea? On NUMA machines this could mean accessing far-away memory. */ iattr = &default_attr;

pthreadライブラリのコードのどこかにあるはずですが、正確にはどこにあるのかわかりません。

default_attrの定義がpthread_create.cにあることを知っています。

static const struct pthread_attr default_attr = { /* Just some value > 0 which gets rounded to the nearest page size. */ .guardsize = 1, };

http://sourceware.org/git/?p=glibc.git;a=blob;f=nptl/pthread_create.c;h=4fe0755079e5491ad360c3b4f26c182543a0bd6e;hb=HEAD#l457

しかし、これが結合可能なスレッドになることをコードのどこに正確に記述しているかはわかりません。

前もって感謝します。

4

1 に答える 1

2

まず、貼り付けたコードから、ほとんどすべてのフィールドにゼロが含まれていることがわかりdefault_attrます(Cには、半分初期化された変数などはありません。一部のフィールドのみを初期化すると、他のフィールドは0に設定されます)。

次に、次のpthread_createコードが含まれています。

/* Initialize the field for the ID of the thread which is waiting
   for us.  This is a self-reference in case the thread is created
   detached.  */
pd->joinid = iattr->flags & ATTR_FLAG_DETACHSTATE ? pd : NULL;

iattr->flagsこの行は、ビットが設定されているかどうかをチェックしますが、 0であるため、ATTR_FLAG_DETACHSTATEビットが設定されてdefault_attrいません。したがって、切り離されたスレッドの場合とそうでない場合があります。default_attr.flagspd->joinidNULLpd

(この回答はGNU glibcにのみ適用され、POSIX pthreadには一般的に適用されないことに注意してください。)

于 2013-01-19T10:38:47.813 に答える