struct shm_mutex{
int x;
pthread_mutex_t mutex;
};
void shm_mutex_test(){ //共享储存互斥量
key_t key(ftok(".", 4));
pid_t pid;
if((pid = fork()) > 0){
int shmid = shmget(key, sizeof(shm_mutex), IPC_CREAT | IPC_EXCL | 0600); //创建共享储存
print("shmid:", shmid);
auto shmmtuex = (shm_mutex *)shmat(shmid, nullptr, 0); //连接,0默认为读写
pthread_mutexattr_t mutexattr;
pthread_mutexattr_init(&mutexattr); //属性初始化
pthread_mutexattr_setpshared(&mutexattr, PTHREAD_PROCESS_SHARED); //设置共享属性
pthread_mutex_init(&shmmtuex->mutex, &mutexattr); //锁初始化
for(int i = 0; i < 100000; i++){
pthread_mutex_lock(&shmmtuex->mutex);
shmmtuex->x++;
pthread_mutex_unlock(&shmmtuex->mutex);
}
wait(0);
print(shmmtuex->x);
shmdt(shmmtuex); //分离
shmctl(shmid, IPC_RMID, nullptr); //删除共享储存
}else if(pid == 0){
int shmid;
while((shmid = shmget(key, 0, 0)) == -1);
auto shmmtuex = (shm_mutex *)shmat(shmid, nullptr, 0);
for(int i = 0; i < 100000; i++){
pthread_mutex_lock(&shmmtuex->mutex);
shmmtuex->x++;
pthread_mutex_unlock(&shmmtuex->mutex);
}
shmdt(shmmtuex);
}
}