我被问到从哪里知道当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, };
但我不知道在代码中的确切位置,这导致了一个可连接的线程。
提前致谢。
答案 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。)