在子进程中重新初始化cpp std::mutex

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

我在父进程中有

std::mutex
。父进程
fork
是子进程。子进程在获取锁时阻塞。可能是因为父进程已经获取了锁。
我读过子进程获取父互斥体及其当前状态的副本。此外,在不拥有互斥体的线程中解锁互斥体会导致未定义的行为。

我应该如何重新初始化或解锁子进程中的

std::mutex
,使其不被阻塞?

c++ fork stdmutex
1个回答
0
投票

你需要了解 fork 的作用。当您

fork()
时,您将获得第二个进程——几乎就像您运行程序两次一样。除了第二个过程是原件的完整副本。它不共享内存——它是一个副本。它们之间唯一的区别是
fork()
本身的实际返回值 - 父进程获取子进程的 PID,而子进程获取 0。否则,在
fork()
结束时,两个进程都具有相同的内存。

此时,您有两个互斥体——每个进程一个。它们没有以任何方式联系在一起,因为它们现在是分开的。 (除非您使用某种跨进程互斥锁,但您没有提到。)

如果互斥锁在

fork()
开始时被锁定,那么它在每个进程中仍然处于锁定状态。并且释放父进程中的锁对子进程没有任何作用。

所以你的子进程可能会永远阻塞,尽管我自己还没有测试过。

您的孩子应该做一些特殊处理。具体来说,您可能必须手动解锁该互斥体。

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