Linux 我应该在克隆(2)中设置哪些标志,以便它与pthread_create()一样工作?

Linux 我应该在克隆(2)中设置哪些标志,以便它与pthread_create()一样工作?,linux,multithreading,pthreads,clone,Linux,Multithreading,Pthreads,Clone,我已经完成了pthread\u create(3)的strace(1)。它间接调用克隆(2)系统调用 在那里它将设置以下标志:(我使用的是i386 GNU/Linux(Mint 13)) 我对这一切都很在行。但我的问题是为什么pthread\u create()设置CLONE\u CHILD\u CLEARTID标志?据我所知,CLONE\u CHILD\u SETTID将在子内存中的ctid位置设置子线程id,CLONE\u CHILD\u CLEARTID将在子线程退出时将其擦除 (因为没有

我已经完成了
pthread\u create(3)
strace(1)
。它间接调用
克隆(2)
系统调用

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

我对这一切都很在行。但我的问题是为什么
pthread\u create()
设置
CLONE\u CHILD\u CLEARTID
标志?据我所知,
CLONE\u CHILD\u SETTID
将在子内存中的ctid位置设置子线程id,
CLONE\u CHILD\u CLEARTID
将在子线程退出时将其擦除

(因为没有
CLONE\u CHILD\u SETTID
标志集,那么为什么
CLONE\u CHILD\u CLEARTID
?)

真的需要吗?当我们想使用
clone(2)
实现
pthread\u create()
的功能时,我们应该设置什么样的理想标志


该领域的初学者。

好吧,您不能仅使用
克隆
复制
pthread\u create
clone
是为了支持库的使用而编写的,例如通过pthreads,但它本身基本上是一个非常可定制的线程分叉函数

例如,
CLONE\u CHILD\u CLEARTID
被设计为支持
pthread\u join
。它实际上是将ctid上的值设为零,然后唤醒调用futex_等待该地址的线程。因此,
pthread\u join
可以通过简单地检查
ctid
是否为零(如果为零,则立即返回状态),然后在必要时执行futex\u等待(假设正确同步)来实现


基本上,
clone
pthread\u create
不可分割的一部分,但它不是唯一的一部分。为了支持更高级的使用,就像pthreads提供给您的一切一样,您必须在
clone
和其他调用之上编写库代码。

那么,您不能仅使用
clone
复制
pthread\u create
clone
是为了支持库的使用而编写的,例如通过pthreads,但它本身基本上是一个非常可定制的线程分叉函数

例如,
CLONE\u CHILD\u CLEARTID
被设计为支持
pthread\u join
。它实际上是将ctid上的值设为零,然后唤醒调用futex_等待该地址的线程。因此,
pthread\u join
可以通过简单地检查
ctid
是否为零(如果为零,则立即返回状态),然后在必要时执行futex\u等待(假设正确同步)来实现

基本上,
clone
pthread\u create
不可分割的一部分,但它不是唯一的一部分。为了支持更高级的使用,就像pthreads提供给您的一切一样,您必须在
clone
和其他调用之上编写库代码

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