0

有人问我,我们从哪里知道当NULL作为函数中的第二个参数传递时pthread_create(),线程是可连接的。

我的意思是,我知道手册页是这样说的,但是需要代码中的理由。我知道当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->flagsATTR_FLAG_DETACHSTATE位,(对于default_attr)它没有设置,因为它default_attr.flags是 0。因此,对于分离的线程,它设置pd->joinidNULL而不是设置。pd

(请注意,此答案仅适用于 GNU glibc,而不适用于一般的 POSIX pthread。)

于 2013-01-19T10:38:47.813 回答