多进程c ++的锁机制

时间:2014-05-08 08:01:59

标签: c++ visual-studio-2008 boost mutex shared-memory

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

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

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同时对同一个对象执行另一个操作? / p>

如何防止这种行为?哪种提升互斥类型适用于多进程和应用程序?

1 个答案:

答案 0 :(得分:0)

我不了解boost实现,但是如果你在具有posix线程的平台上,你可以使用本机线程实现来做到这一点。您创建了一个pthread_mutex_t,其中包含"进程共享"属性,并将其放入共享内存中,您可以从这两个进程访问它。

有一节详细介绍了如何在Dorel 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线程 - 为以posix为中心的答案道歉!

使用Windows线程(再次本机),您可以通过创建命名的互斥锁在进程之间共享互斥锁,并在多个进程中按名称访问它。 ]