【发布时间】: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