Linux 之 进程间互斥
正文
使用互斥锁实现进程间同步
1.创建互斥锁属性,并将之设置为PTHREAD_PROCESS_SHARED
2.使用mmap函数创建合适大小的共享内存映射
3.使用互斥锁属性初始化共享内存映射中的互斥锁
#include<stdio.h>
#include<unistd.h>
#include<string.h>
#include<stdlib.h>
#include<pthread.h>
#include<errno.h>
#include<sys/mman.h>
typedef struct Node
{
int val;
pthread_mutex_t mutex;
}Node;
void str_error(const char* str)
{
perror(str);
exit(-1);
}
void pstr_error(const char * str)
{
printf("%s: %s\n",str,strerror(errno));
exit(-1);
}
int main()
{
//创建互斥量属性
pthread_mutexattr_t mutexattr;
pthread_mutexattr_init(&mutexattr);
pthread_mutexattr_setpshared(&mutexattr,PTHREAD_PROCESS_SHARED);
//创建共享内存
Node* p = mmap(NULL,sizeof(Node),PROT_READ|PROT_WRITE,MAP_SHARED|MAP_ANONYMOUS,-1,0);
if(p == MAP_FAILED)
{
str_error("mmap create error");
}
//初始化互斥锁
if( pthread_mutex_init(&(p->mutex),&mutexattr) != 0)
{
pstr_error("mutex init error");
}
pid_t id;
id = fork();
if(id == -1)
{
str_error("process create error");
}
else if(id == 0)
{
while(1)
{
pthread_mutex_lock(&(p->mutex));
printf("son process[%d] val = %d\n",getpid(),++(p->val));
pthread_mutex_unlock(&(p->mutex));
sleep(1);
}
}
else
{
while(1)
{
pthread_mutex_lock(&(p->mutex));
printf("father process[%d] val = %d\n",getpid(),++(p->val));
pthread_mutex_unlock(&(p->mutex));
sleep(1);
}
}
if(pthread_mutexattr_destroy(&mutexattr) != 0)
str_error("mutexattr destroy error");
if(pthread_mutex_destroy(&(p->mutex)) != 0)
str_error("mutex destroy error");
}