pthread_key_create() 在进程分叉后生成的密钥会发生什么?

What happens to pthread_key_create() generated keys after a process fork?

来自 pthread_key_create FreeBSD 手册页: /评论

... The pthread_key_create() function creates a thread-specific data key visible to all threads in the process. Key values provided by pthread_key_create() are opaque objects used to locate thread-specific data. Although the same key value may be used by different threads, the values bound to the key by pthread_setspecific() are maintained on a per-thread basis and persist for the life of the calling thread.

我假设生成的 pthread_key_t 实例绑定到一个进程(因此 opaque 手册页中的单词),并且这些在 fork() 之后变得无效。但是,我在现有的手册页或文档中找不到任何参考资料。

任何人都可以confirm/comment吗?

I am assuming that produced pthread_key_t instances are bound to a process

有充分的理由认为实例是 process-specific,因为如果你,比如说,在共享内存中记录一个键的表示,那么它对碰巧映射相同的不相关进程没有意义共享内存段。

(hence the opaque word in the man page),

但是“不透明”与此没有特别的关系。这只是意味着里面没有 user-serviceable 部分。您只能将其作为一个整体使用。

and that these become invalid after a fork().

这似乎有点跳跃。我根本不希望那样。 fork() 创建调用进程的几乎完全相同的副本,受一些明确枚举的异常的影响,这些异常在 the manual 中列出。可能最相关的是新进程仅包含一个线程(调用 fork() 的线程)。 thread-specific 数据键的失效不在列表中,child 的一个初始线程的 thread-specific 数据丢失也不在列表中。

I couldn't find any reference in existing man pages or documentation however.

确实如此。

HOWEVER, multi-threaded 程序通常不应分叉,因为 child 进程处于无效状态的风险很高,例如与被 child 中不存在的线程锁定的互斥锁一样。有一些特殊情况,例如立即 exec 分叉 child,但在大多数情况下,您不应尝试将多线程与多处理混合使用。