gcc __thread 局部变量在多线程程序中使用 fork()

问题描述 投票:0回答:1

我在 X86 RHEL 8 和 gcc 8.5 上使用“常规 C”程序。 (尽管我可能会转向 RHEL 9)。

如果我有一个使用一些“__thread”全局变量的多线程程序,并且该程序中的一个线程 forks(),那么父进程在子进程中分配的线程局部变量的副本会发生什么?

为“其他”(非分叉)线程创建的线程局部变量的实例(可能现在无法访问)是否继续存在于子线程中?或者它们是否被解除分配(在子进程中),就好像这些线程已经结束一样?

我认为从其他线程 malloc()ed 的内存之类的东西会保留在子进程中,但我不确定全局 TLS 变量。

我猜测执行 fork() 的线程的线程本地存储的“副本”最终会被子进程线程使用。

我担心的是,如果来自其他父线程的这些“其他”TLS 变量实例最终出现在子进程中,那么后续的 forks() 是否会继续积累额外的“未使用”TLS 数据(或不积累)。

就我而言,我无法在 fork() 发生之前结束其他线程。

multithreading gcc fork thread-local-storage
1个回答
0
投票

线程本地存储只是内存,与线程特定的堆栈内存没有什么不同。因此,它将被映射到新进程的地址空间。然而,由于新进程中只有一个线程,因此无法轻松访问这块内存。

这不应该是一个问题,因为内存没有被复制,只是映射为写时复制。没有任何内容写入该内存,因此它只是另一组未使用的页面。

应该关注的是子进程中存在的所有锁定的互斥体,没有线程来解锁它们。但这在其他地方已经描述过很多次了。

© www.soinside.com 2019 - 2024. All rights reserved.