【问题标题】:What flags should i have to set in clone(2) so that it will work same as pthread_create()?我应该在 clone(2) 中设置哪些标志,以便它与 pthread_create() 一样工作?
【发布时间】:2012-08-22 14:56:51
【问题描述】:

我已经完成了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?)

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

该领域的初学者。

【问题讨论】:

    标签: linux multithreading pthreads clone


    【解决方案1】:

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

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

    基本上,clonepthread_create 的一个组成部分,但它不是唯一的部分。为了支持更高级的用法,就像 pthreads 提供给你的所有东西一样,你必须在 clone 和其他调用之上编写库代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-18
      • 2017-08-19
      • 1970-01-01
      • 2015-06-02
      • 2016-08-04
      • 2015-12-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多