设置方式
- 要有一片多进程能一起访问的共享内存。共享内存如何获得本文不做介绍,请自行google。
- 共享内存划一段大小为sizeof(pthread_mutex_t)的内存备用,记这片内存为mutex_reserve。把这片内存初始化为全0。
- 用pthread_mutex_t的指针mutex_p指向mutex_reserve。
- 构造phtread_mutex_t的初始化属性结构体pthread_mutexattr_t attr。
- 设置attr为PTHREAD_PROCESS_SHARED。
- 用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)+

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


被折叠的 条评论
为什么被折叠?



