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,但在大多数情况下,您不应尝试将多线程与多处理混合使用。
来自 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 bypthread_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 bypthread_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,但在大多数情况下,您不应尝试将多线程与多处理混合使用。