linux线程高级属性之同步属性

一、互斥量的属性(进程共享属性和类型属性

//互斥量初始化
    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

猜你喜欢

转载自blog.csdn.net/weixin_42039602/article/details/83152354
今日推荐