POSIX保证信号不会被传递给部分初始化的线程吗?

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

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

据推测,这些函数中的一些(至lessfork ,必须检查由pthread_atfork函数build立的全局状态)取决于线程处于一致的初始化状态。

有一件令我困扰的事情是我已经读了很多glibc / nptl源代码,并且找不到任何显式的同步来防止新创build的线程在完全初始化之前处理信号。 我希望调用pthread_create的线程可以在调用clone之前阻塞所有的信号,并且一旦初始化完成,新线程就可以解除阻塞,但是我找不到任何代码,也不会在strace输出中看到它。

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

这是一个非常有趣的问题。 我已经通过glibc代码来查看pthread_create ,看看它是如何工作的,除非我完全错过了某些东西,似乎没有任何特殊的行为来阻止它(例如,在clone之前阻止所有信号,并将其解除阻塞孩子在一些设置后{记录线程创建时间和C + +捕获所有异常处理程序设置,即使在C代码})。

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

也许你应该总是把pthread_create代码来阻塞和恢复信号,并且用一个unblock调用来启动所有的线程函数。

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

POSIX pthread_create规范要求从我的理解:

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

  • 信号掩码应该从创建线程继承。
  • 新线程挂起的信号集应该是空的。

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

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

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