【问题标题】:Lock mechanism for multiple process c++多进程c++的锁机制
【发布时间】:2014-05-08 08:01:58
【问题描述】:

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

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

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 mutex 类型适合多进程和应用程序?

【问题讨论】:

  • 两个函数必须使用相同的实例互斥锁(例如 boost::interprocess::interprocess_mutex),然后它应该可以按您的预期工作。放置一个 scoped_lock<:interprocess::interprocess_mutex> lock(mutex);在每个函数的开头,你不需要关心其余的。还是我误解了你的问题?
  • 不,你理解完全正确。但问题是我不明白不同的应用程序将如何使用同一个互斥锁实例,因为它们的地址空间也不同?
  • 对不起,我错过了标题,我不知道你在谈论共享内存,就像进程间通信一样。我假设您正在使用 boost 共享内存功能,因此您映射内存,使用它并最终释放它。无需锁定。看看这里boost.org/doc/libs/1_54_0/doc/html/interprocess/…
  • 据我所知;即使您使用 boost::managed_shared_memory,默认情况下 boost 也不保证线程安全,因为它需要任何每个共享内存应用程序不需要该功能的成本。所以你必须通过使用互斥锁来保证它的安全......但是如果我们遇到第一个问题,我们如何才能保证它的安全,因为我们不能在不同的进程中使用同一个互斥锁实例。

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


【解决方案1】:

我不知道 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 线程 - 为以 posix 为重点的答案道歉!

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-28
    • 2014-07-13
    • 1970-01-01
    • 1970-01-01
    • 2010-12-25
    • 1970-01-01
    相关资源
    最近更新 更多