一、互斥量的属性(进程共享属性和类型属性)
//互斥量初始化
int pthread_mutexattr_init(pthread_mutexattr_t *attr);
//互斥量销毁
int pthread_mutexattr_destroy(pthread_mutexattr_t *attr);
>进程共享属性:
进程共享属性有两种值:
1、PTHREAD_PROCESS_PRIVATE,这个是默认值,同一个进程中的多个线程访问同一个同步对象
2、PTHREAD_PROCESS_SHARED, 这个属性可以使互斥量在多个进程中进行同步,如果互斥量在多进程的共享内存区域,那么具有这个属性的互斥量可以同步多进程。
进程共享属性需要检测系统是否支持,可以检测宏_POSIX_THREAD_PROCESS_SHARED
//设置互斥量进程共享属性
int pthread_mutexattr_setpshared(pthread_mutexattr_t *attr, int pshared);
//获取互斥量进程共享属性
int pthread_mutexattr_getpshared(const pthread_mutexattr_t
*restrict attr, int *restrict pshared);
三、互斥量的类型属性
类型属性
互斥量类型 | 没有解锁时再次加锁 | 解别的线程的锁 | 已解锁时解锁 |
PTHREAD_MUTEX_NORMAL | 死锁 | 未定义 | 未定义 |
PTHREAD_MUTEX_ERRORCHECK | 返回错误 | 返回错误 | 返回错误 |
PTHREAD_MUTEX_RECURSIVE | 允许 | 返回错误 | 返回错误 |
PTHREAD_MUTEX_DEFAULT | 未定义 | 未定义 | 未定义 |
获取/设置互斥量的类型属性
int pthread_mutexattr_settype(pthread_mutexattr_t *attr, int type);
int pthread_mutexattr_gettype(const pthread_mutexattr_t *restrict attr,
int *restrict type);
四、读写锁与条件变量的属性
1、读写锁也有属性,它只有一个进程共享属性
读写锁属性初始化
int pthread_rwlockattr_destroy(pthread_rwlockattr_t *attr);
int pthread_rwlockattr_init(pthread_rwlockattr_t *attr);
设置读写锁进程共享属性
int pthread_rwlockattr_getpshared(const pthread_rwlockattr_t *restrict attr,
int *restrict pshared);
int pthread_rwlockattr_setpshared(pthread_rwlockattr_t *attr, int pshared);
2、条件变量也有进程共享属性
条件变量属性初始化
int pthread_condattr_destroy(pthread_condattr_t *attr);
int pthread_condattr_init(pthread_condattr_t *attr);
设置条件变量属性
int pthread_condattr_getpshared(const pthread_condattr_t *restrict attr,
int *restrict pshared);
int pthread_condattr_setpshared(pthread_condattr_t *attr, int pshared);
实例:互斥量的进程共享
#include<stdio.h>
#include<sys/mman.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
#include<string.h>
#include<pthread.h>
int main(int argc,char *argv[])
{
int shm_id1,shm_id2;
char * shm = "a", * shm1 = "b";
char *buf;
pid_t pid;
pthread_mutex_t *mutex;
pthread_mutexattr_t mutexattr;
//创建、打开共享内存1
shm_id1 = shm_open(shm,O_RDWR|O_CREAT,0744);
//调整内存空间大小
ftruncate(shm_id1,100);
//映射共享内存到互斥量
mutex = (pthread_mutex_t *)mmap(NULL,100,PROT_READ|PROT_WRITE,MAP_SHARED,shm_id1,0);
pthread_mutexattr_init(&mutexattr);//互斥量属性初始化
#ifdef _POSIX_THREAD_PROCESS_SHARED
pthread_mutexattr_setpshared(&mutexattr,PTHREAD_PROCESS_SHARED);//互斥量进程共享属性设置
#endif
pthread_mutex_init(mutex,&mutexattr);//互斥量初始化
//创建、打开共享内存2
shm_id2 = shm_open(shm1,O_RDWR|O_CREAT,0744);
//调整内存空间大小
ftruncate(shm_id2,100);
//映射共享内存
buf = (char *)mmap(NULL,100,PROT_READ|PROT_WRITE,MAP_SHARED,shm_id2,0);
//fork()创建新进程
pid = fork();
if(pid==0)
{
sleep(1);
printf("I am child process\n");
pthread_mutex_lock(mutex);
memcpy(buf,"liushuangbin",12);
printf("child process: buf value is %s\n",buf);
pthread_mutex_unlock(mutex);
}
if(pid>0)
{
pthread_mutex_lock(mutex);
printf("I am parent process\n");
memcpy(buf,"huangxiaomei",12);
sleep(2);
printf("parent process: buf value is %s\n",buf);
pthread_mutex_unlock(mutex);
}
pthread_mutexattr_destroy(&mutexattr);//互斥量属性销毁
pthread_mutex_destroy(mutex);//互斥量销毁
munmap(mutex,100);//解除虚拟内存映射
shm_unlink(shm);//释放共享内存
munmap(buf,100);
shm_unlink(shm1);
}
运行结果:
binge@binge-HP-Compaq:~/my_share/pthread$ gcc -pthread thread_mutexattr.c -lrt
binge@binge-HP-Compaq:~/my_share/pthread$ ./a.out
I am parent process
I am child process
parent process: buf value is huangxiaomei
child process: buf value is liushuangbin