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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章