关于是否可以在进程之间共享pthread互斥锁,stackoverflow上有很多问题,但我没有发现有关共享互斥锁初始化的问题/答案.
据我所知,使用进程共享互斥锁的常用方法如下:分配共享内存块,在共享内存块上初始化pthread互斥锁,使用它.
在共享内存创建的情况下,如果多个进程尝试分配具有相同密钥ID的共享内存块,则由OS处理.好的,但我不明白的是如何安全地初始化共享内存块上的互斥锁?
我是对的,pthread_mutex_init没有提供任何安全的方法来同时从不同的进程初始化pthread_mutex_t吗?如果是,我如何为进程初始化共享“互斥”提供独占访问权限?如何确定另一个进程是否成功初始化了互斥锁?
第二个问题涉及阻止互斥锁的进程崩溃的情况.好的,有一个强大的互斥锁处理这种情况并返回相应的错误代码.共享内存块怎么样?似乎一个进程应该注意它是否是使用共享内存来破坏它的最后一个进程.
最佳答案 我是对的,pthread_mutex_init没有提供任何安全的方法来同时从不同的进程初始化pthread_mutex_t吗?
正确.您可以确保只有一个进程在互斥锁上调用pthread_mutex_init(),并且在该调用成功返回之前,没有进程尝试在互斥锁上运行.
例如,使用POSIX shm_open()共享内存区域,您可以让进程尝试使用O_CREAT和O_EXCL标志打开该区域,这样一个进程就可以成功创建它.然后,此过程负责调整共享内存区域的大小并使用pthread_mutex_init()初始化互斥锁.然后其他进程必须在打开共享内存区域之前等待初始化过程中的某种通知 – 例如,您可以让进程阻止打开FIFO O_RDONLY,并让初始化进程通过打开FIFO O_WRLY来通知它们(这将导致开放成功).
通常,共享内存段不是进程之间唯一的通信通道.通常,您将通过UNIX域套接字引导通信,并通过它协商共享内存区域的设置,甚至可能通过带有SCM_RIGHTS消息的套接字传递共享内存区域文件描述符.然后,共享内存区域将用于加速性能敏感的IPC.