pthread POSIX C库detachstate

时间:2013-01-19 10:05:44

标签: c linux pthreads posix libraries

我被问到从哪里知道当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

但我不知道在代码中的确切位置,这导致了一个可连接的线程。

提前致谢。

1 个答案:

答案 0 :(得分: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是否设置了ATTR_FLAG_DETACHSTATE位,(default_attr)它没有设置,因为default_attr.flags为0.因此设置{{1}对于分离的线程,{}为pd->joinid而不是NULL

(请注意,这个答案仅适用于GNU glibc,而不适用于POSIX pthreads。)