一、互斥量的屬性(進程共享屬性和類型屬性)
//互斥量初始化
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