1

我做了strace(1)一个pthread_create(3)。它间接调用clone(2)系统调用。

它将在那里设置以下标志:(我使用的是 i386 GNU/Linux (Mint 13))

CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND | CLONE_THREAD | CLONE_SYSVSEM | CLONE_SETTLS | CLONE_PARENT_SETTID | CLONE_CHILD_CLEARTID

我对所有这些标志都很满意。但我的问题是为什么要pthread_create()设置CLONE_CHILD_CLEARTID标志?据我所知CLONE_CHILD_SETTID,将在子内存中的位置 ctid 设置子线程 id,并CLONE_CHILD_CLEARTID在子退出时将其擦除。

(因为没有CLONE_CHILD_SETTID设置标志,那为什么CLONE_CHILD_CLEARTID?)

真的需要吗?pthread_create()当我们想要实现using的功能时,我们应该设置哪些理想的标志clone(2)

该领域的初学者。

4

1 回答 1

5

好吧,您不能pthread_create仅使用clone. clone是为了支持库的使用而编写的,例如由 pthreads 编写,但它本身基本上是一个非常可定制的线程分叉函数。

CLONE_CHILD_CLEARTID例如,旨在支持pthread_join. 它本质上所做的是将 处的值归零ctid,然后唤醒在该地址上调用了 futex_wait 的线程。因此,pthread_join可以通过简单地检查是否ctid为零(如果是则立即返回状态),然后在必要时执行 futex_wait 来实现(假设正确同步)。

基本上,clone是不可分割的一部分,pthread_create但不是唯一的部分。为了支持更高级的使用,就像 pthreads 给你的所有东西一样,你必须在clone其他调用之上编写库代码。

于 2012-08-28T06:28:55.173 回答