多进程锁机制

visual studio 2008 - Lock mechanism for multiple process c++

本文关键字:机制 多进程      更新时间:2023-10-16

我的问题与多个应用程序使用的共享内存对象中的互斥锁的工作逻辑有关。

假设我们有两个函数,它们对共享内存中创建的对象执行一些操作。

void funcA ()
{
// put some mutex here
/*
.
do the operation on the shared object here
.
*/
}
void funcB ()
{
// put some mutex here
/*
.
do the operation on the shared object here
.
*/
}

既然互斥锁锁的是代码而不是共享内存对象,那么是否有可能一个应用程序调用funcA并对共享对象执行一些操作,而另一个应用程序调用funcB同时对同一对象执行另一个操作?

如何防止这种行为?哪种boost互斥锁类型适合多进程和应用?

我不知道boost的实现,但是如果您使用posix线程的平台,您可以使用本机线程实现。您创建一个带有"进程共享"属性的pthread_mutex_t,并将其放入共享内存中,您可以从两个进程访问它。

在Daryl Gove的《多核应用程序编程》(优秀的)一书中有一节详细介绍了如何做到这一点,无论如何,对于多线程c++开发来说,这本书非常值得一读。这个例子的互斥属性部分是:

pthread_mutex_t * mutex;
pthread_mutexattr_t attributes;
pthread_mutexattr_init( &attributes );
pthread_mutexattr_setpshared( &attributes, PTHREAD_PROCESS_SHARED );
...

在设置了互斥锁的属性之后,这将互斥锁定义为进程共享互斥锁,然后您可以将其放入共享内存中以供多个进程访问,并保护对共享数据结构的访问。

考虑到它存在于posix线程实现中,因此值得仔细查看boost线程库中的进程共享属性,以查看是否也暴露了在那里使用它。

(编辑:我刚刚注意到你的帖子上有visual studio标签,所以你使用的是Windows线程——很抱歉你的回答是正面的!

使用Windows线程(同样是原生的),您可以通过创建命名互斥锁在进程之间共享互斥锁,并在多个进程之间通过名称访问它。)