我在父进程中有
std::mutex
。父进程fork
是子进程。子进程在获取锁时阻塞。可能是因为父进程已经获取了锁。我应该如何重新初始化或解锁子进程中的
std::mutex
,使其不被阻塞?
你需要了解 fork 的作用。当您
fork()
时,您将获得第二个进程——几乎就像您运行程序两次一样。除了第二个过程是原件的完整副本。它不共享内存——它是一个副本。它们之间唯一的区别是 fork()
本身的实际返回值 - 父进程获取子进程的 PID,而子进程获取 0。否则,在 fork()
结束时,两个进程都具有相同的内存。
此时,您有两个互斥体——每个进程一个。它们没有以任何方式联系在一起,因为它们现在是分开的。 (除非您使用某种跨进程互斥锁,但您没有提到。)
如果互斥锁在
fork()
开始时被锁定,那么它在每个进程中仍然处于锁定状态。并且释放父进程中的锁对子进程没有任何作用。
所以你的子进程可能会永远阻塞,尽管我自己还没有测试过。
您的孩子应该做一些特殊处理。具体来说,您可能必须手动解锁该互斥体。