在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输出中看到它.
解决方法
原文地址:https://www.jb51.cc/c/113294.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。