gpt4 book ai didi

c++ - 多进程c++的锁机制

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:53:44 32 4
gpt4 key购买 nike

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

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

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 实现,但如果您使用的是具有 posix 线程的平台,则可以使用 native 线程实现来执行此操作。您创建一个具有“进程共享”属性的 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 线程(同样是原生的),您可以通过创建命名的互斥锁并在多个进程间按名称访问它来在进程之间共享互斥锁。]

关于c++ - 多进程c++的锁机制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23536052/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com