代码之家  ›  专栏  ›  技术社区  ›  R.. GitHub STOP HELPING ICE

POSIX是否保证信号不会传递到部分初始化的线程?

  •  10
  • R.. GitHub STOP HELPING ICE  · 技术社区  · 14 年前

    在大多数POSIX线程的实现中,在新创建的线程处于能够运行应用程序代码的一致状态之前,需要对其进行一些初始化。这可能涉及解锁线程结构中的锁、在使用“线程寄存器”的实现中初始化“线程寄存器”、初始化线程本地数据(编译器级TLS或POSIX线程特定数据)等。我找不到明确的保证,即在线程接收到任何信号之前,将完成所有这些初始化;我能找到的最接近的是2.4.3:

    下表定义了一组应为异步信号安全的函数。因此,应用程序可以无限制地从信号捕获函数调用它们:

    ...

    据推测,其中一些功能(至少 fork ,它必须检查 pthread_atfork 函数)取决于线程处于一致的初始化状态。

    令我困扰的一件事是,我已经阅读了很多glibc/nptl源代码,并且找不到任何显式同步来防止新创建的线程在完全初始化之前处理信号。我希望线程调用 pthread_create 在呼叫前阻止所有信号 clone ,使新线程在初始化完成后解除阻止它们,但我找不到任何这样的代码,也看不到 strace

    3 回复  |  直到 14 年前
        1
  •  1
  •   nategoose    14 年前

    (我不认为这是一个真正的答案,但这是一个大的评论)

    这是一个非常有趣的问题。我查过glibc代码 pthread_create 为了观察它的行为,除非我完全忽略了一些东西,否则似乎没有任何特殊的行为来阻止它(比如在 clone 在一些设置之后,在孩子中解锁它们。{在记录了线程创建时间后,设置了C++ catch异常处理程序,即使在C代码}中也会发生。

    我希望能找到一条评论,提到这种情况的可能性,甚至提到POSIX说要做什么(或者说它没有说要做什么)。

    也许你应该总是把 创建线程 在代码中阻止和还原信号,并用unblock调用启动所有线程函数。

    这很可能是pthreads(或glibc或我对代码的理解)中的一个过度站点。

        2
  •  0
  •   Jeremy W. Sherman    14 年前

    这个 POSIX pthread_create specification 根据我对以下方面的理解,授权:

    新线程的信号状态初始化如下:

    • 信号屏蔽应继承自创建线程。
    • 新线程的待处理信号集应为空。

    但我没有足够的经验来说明在各种实现中都是这样的。

        3
  •  -1
  •   Brad    14 年前

    pthread_create是一个阻塞调用。没有(新的)线程可以在调用之前向其发送信号,并且 发送信号的线程 之后 调用,因此线程的ID由调用返回。

    因此,我得出结论,线程必须是有效的,并在那个时候初始化。。。