Bri*_*era 1 linux multithreading clone pthreads
我已经做了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
Run Code Online (Sandbox Code Playgroud)
这个旗帜我很好.但我的问题是为什么pthread_create()设置CLONE_CHILD_CLEARTID标志?根据我的知识,CLONE_CHILD_SETTID将子线程id设置在子存储器中的位置ctid,并CLONE_CHILD_CLEARTID在子进入时将其擦除.
(因为没有CLONE_CHILD_SETTID设置标志,为什么CLONE_CHILD_CLEARTID?)
真的需要吗?当我们想要实现pthread_create()使用功能时,我们应该设置什么是理想的标志clone(2)?
这个领域的初学者.
好吧,你不能pthread_create只使用复制clone.clone编写是为了支持库的使用,例如通过pthreads,但就其本身而言,它基本上是一个非常可定制的线程fork函数.
CLONE_CHILD_CLEARTID例如,旨在支持pthread_join.它本质上做的是将值置零ctid,然后唤醒在该地址上调用futex_wait的线程.因此,pthread_join可以通过简单地检查是否ctid为零来实现(如果是,则立即返回状态),然后在必要时执行futex_wait(假设正确同步).
基本上,clone它是不可或缺的一部分,pthread_create但它不是唯一的一部分.为了支持更高级的用法,就像pthreads给你的所有东西一样,你必须在clone其他调用之上编写库代码.