gpt4 book ai didi

c++ - 如果进程在获取锁时发生 fork ,那么 boost 进程间互斥锁上的锁会发生什么情况?

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:42:08 25 4
gpt4 key购买 nike

假设我们有一个包含两个线程的进程。一个线程在一些共享资源上做一些工作,并定期在 boost::interprocess::mutex 上获取一个作用域锁。另一个线程在某个随机时间导致 fork/exec。

线程 1

void takeLockDoWork() {
using namespace boost::interprocess;
managed_shared_memory segment(open_only, "xxx");
interprocess_sharable_mutex *mutex = segment.find<interprocess_sharable_mutex>("mymutex").first;
scoped_lock<interprocess_sharable_mutex> lock(*mutex);
// access or do work on a shared resource here
//lock automatically unlocks when scope is left.
}

假设线程 2 在 scoped_lock 被取出后立即 fork 。据推测,子进程与父进程具有相同的锁定状态。

会发生什么?现在是否会出现与父进程的竞争条件?

最佳答案

只要您不从持有 interprocess_sharable_mutex 的线程派生或访问受互斥锁保护的内存,就没问题。

互斥锁存在于共享内存中,这意味着即使你 fork 了,互斥锁状态也不会被复制;它存在于一个地方,可以被两个进程访问。

因为 forking 只维护子线程中的 forking 线程,只有父线程中的另一个线程认为它拥有 mutex 的所有权,所以没有问题。即使您在 fork 后尝试获取互斥锁,您仍然可以;它只会阻塞,直到 parent 释放它。

关于c++ - 如果进程在获取锁时发生 fork ,那么 boost 进程间互斥锁上的锁会发生什么情况?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26810366/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com