多进程共享的pthread_mutex_t

文章讲述了如何在多进程中设置共享内存并使用pthread_mutex_t实现互斥锁,强调了PTHREAD_PROCESS_SHARED的重要性以及不正确的初始化可能导致的问题。作者还提供了实验结果和代码示例。

设置方式

  1. 要有一片多进程能一起访问的共享内存。共享内存如何获得本文不做介绍,请自行google。
  2. 共享内存划一段大小为sizeof(pthread_mutex_t)的内存备用,记这片内存为mutex_reserve。把这片内存初始化为全0。
  3. 用pthread_mutex_t的指针mutex_p指向mutex_reserve。
  4. 构造phtread_mutex_t的初始化属性结构体pthread_mutexattr_t attr。
  5. 设置attr为PTHREAD_PROCESS_SHARED。
  6. 用attr初始化mutex_p指向的phtread_mutex_t。

答疑

1.用NULL初始化共享内存中的pthread_mutex_t可以吗?也就是省略掉步骤4和5。

答:不完全可以。不用被设置为PTHREAD_PROCESS_SHARED的attr初始化mutex,mutex也能保证互斥:实验表明,如果进程不调用sleep(),省略与不省略步骤4-5的结果是一样的,没有任何两个进程同时进入临界区。但是如果有一个进程带锁休眠(lock后调用sleep(1))。则它有可能使得其他进程不能再获得锁。永久阻塞在lock函数上。至于为什么我也不知道。不设置PTHREAD_PROCESS_SHARED可能还有其他不预期的事发生,所以还是设置PTHREAD_PROCESS_SHARED好。

2.看到一篇博客说,pthread_mutexattr_t也需要在共享内存中

答:不需要。它就是mutex初始化时的一个指导,这个指导在哪个位置并不重要。

3. 第二点,不初始化那片内存为全0可以吗?

答:不可以。pthread_mutex_init有个规定,那就是它init的那片内存为全0。

参考代码

#include<pthread.h>
#include<stdio.h>
#include<unistd.h>
#include<fcntl.h>  //open
#include<sys/mman.h>
#include<string.h>
int id;
int main()
{
   
   
    int fd=open("test_shared_lock_a",O_RDWR|O_CREAT,0777);
    int result=ftruncate(fd,sizeof(pthread_mutex_t)+
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值