进程间使用mutex来实现同步:
#include <pthread.h>
#include <sys/mman.h>
#include <sys/wait.h>
#include<stdio.h>
#include<stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include<string.h>
struct mt {
int num;
pthread_mutex_t mutex;
pthread_mutexattr_t mutexattr;
};
int main(void)
{
int fd, i;
struct mt *mm;
pid_t pid;
/*
fd = open("mt_test", O_CREAT | O_RDWR, 0777);
ftruncate(fd, sizeof(*mm));
mm = mmap(NULL, sizeof(*mm), PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
close(fd);
unlink("mt_test");*/
mm = mmap(NULL, sizeof(*mm), PROT_READ|PROT_WRITE, MAP_SHARED|MAP_ANON, -1, 0);
memset(mm, 0, sizeof(*mm));
pthread_mutexattr_init(&mm->mutexattr); //初始化mutex属性对象
pthread_mutexattr_setpshared(&mm->mutexattr, PTHREAD_PROCESS_SHARED); //修改属性为进程间共享
pthread_mutex_init(&mm->mutex, &mm->mutexattr); //初始化一把mutex琐
pid = fork();
if (pid == 0) {
for (i = 0; i < 10; i++) {
pthread_mutex_lock(&mm->mutex);
(mm->num)++;
printf("-child----num++ %d\n", mm->num);
pthread_mutex_unlock(&mm->mutex);
sleep(rand()%2+1);
}
} else if (pid > 0) {
for ( i = 0; i < 10; i++) {
sleep(rand()%2);
pthread_mutex_lock(&mm->mutex);
mm->num += 2;
printf("-parent---num+=2 %d\n", mm->num);
pthread_mutex_unlock(&mm->mutex);
}
wait(NULL);
}
pthread_mutexattr_destroy(&mm->mutexattr); //销毁mutex属性对象
pthread_mutex_destroy(&mm->mutex); //销毁mutex
munmap(mm,sizeof(*mm)); //释放映射区
return 0;
}
-child----num++ 1
-parent—num+=2 3
-parent—num+=2 5
-parent—num+=2 7
-child----num++ 8
-parent—num+=2 10
-child----num++ 11
-parent—num+=2 13
-parent—num+=2 15
-child----num++ 16
-parent—num+=2 18
-parent—num+=2 20
-parent—num+=2 22
-child----num++ 23
-parent—num+=2 25
-child----num++ 26
-child----num++ 27
-child----num++ 28
-child----num++ 29
-child----num++ 30