我在X86 RHEL 8和gcc 8.5上使用了一个“常规C”程序。(虽然我可能会转移到RHEL 9)。
如果我有一个多线程程序,使用一些'__thread'全局变量,并且该程序的一个线程forks(),那么子进程中父进程分配的线程局部变量的副本会发生什么?
为“其他”(非分叉)线程创建的线程局部变量的示例(可能现在无法访问)是否继续存在于子线程中?或者说,他们是不是在子进程中被解除分配,就像那些线程已经结束了一样?
我认为从其他线程被malloc()艾德占用的内存之类的东西会在子线程中持久化,但我不确定全局TLS变量。
我猜想,执行fork()的线程的线程本地存储的“副本”最终被子进程线程使用。
我担心的是,如果这些来自其他父线程的TLS变量的“其他”示例最终出现在子进程中,那么后续的fork()是否会继续积累额外的“未使用的”TLS数据(或不会)。
在我的例子中,我不能在fork()发生之前结束其他线程。
1条答案
按热度按时间h5qlskok1#
线程本地存储只是内存,与特定于线程的堆栈内存没有什么不同。因此,它将被Map到新进程的地址空间。但是,由于新进程中只有一个线程,因此无法轻松访问此内存。
这不应该是一个问题,因为内存没有被复制,只是被Map为写时复制。没有任何内容写入该内存,因此它只是另一组未使用的页面。
应该关注的是子进程中存在的所有锁定互斥体,而没有线程来解锁它们。但这在其他地方被描述了很多次。