我们假设我们有一个包含两个线程的进程。一个线程在某些共享资源上做了一些工作,并定期在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分叉。据推测,子进程与父进程具有相同的锁定状态。
会发生什么?现在父流程会出现竞争条件吗?
答案 0 :(得分:2)
只要你不从持有interprocess_sharable_mutex
的线程分叉或访问受互斥锁保护的内存,你就可以了。
互斥锁存在于共享内存中,这意味着即使你分叉,互斥锁状态也不会重复;它存在于一个地方,可由两个进程访问。
因为forking只维护子节点中的forking线程,所以只有父节点中的另一个线程认为它拥有互斥锁的所有权,所以没有问题。即使您在分叉后尝试获取互斥锁,您仍然可以;它会阻止,直到父母释放它。