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

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

The following table defines a set of functions that shall be async-signal-safe. Therefore,applications can invoke them,without restriction,from signal-catching functions:

大概,这些功能中的一些(至少是必须检查由pthread_atfork函数建立的全局状态的fork)取决于线程处于一致的初始化状态.

令我烦恼的一件事是,我已经阅读了很多glibc / nptl源代码,并且找不到任何明确的同步,以防止新创建的线程在完全初始化之前被处理.我会期望线程调用pthread_create在调用clone之前阻止所有信号,并且一旦初始化完成,新的线程解除阻塞,但是我找不到任何代码,也不会在strace输出中看到它.

解决方法

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

这是一个非常有趣的问题.我已经通过glibc代码查看pthread_create来查看它的行为,除非我完全错过了一些似乎没有任何特殊的行为来阻止它(例如在克隆之前阻止所有信号,并在孩子经过一些设置{在记录线程创建时间和C捕获所有异常处理程序设置后,甚至在C代码中发生}).

我期待找到一个提到这种情况的可能性的评论,甚至可能提到POSIX所说的做法(或者说它没有说出什么).

也许你应该总是在代码中包装pthread_create来阻止和恢复信号,并用unblock调用启动所有的线程函数.

这可能是pthreads的一个网站(或glibc或我对代码的理解).

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...