如果在获取锁定时进程分叉,那么对提升进程间互斥锁的锁定会发生什么?

时间:2014-11-07 21:27:46

标签: c++ boost concurrency boost-interprocess

我们假设我们有一个包含两个线程的进程。一个线程在某些共享资源上做了一些工作,并定期在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.
}

在scoped_lock被取出后,让我们说线程2分叉。据推测,子进程与父进程具有相同的锁定状态。

会发生什么?现在父流程会出现竞争条件吗?

1 个答案:

答案 0 :(得分:2)

只要你不从持有interprocess_sharable_mutex的线程分叉或访问受互斥锁保护的内存,你就可以了。

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

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