概述
进程间同步可以使用互斥量mutex(互斥锁)、信号量和文件锁。本文只讲进程间使用互斥量进行同步。这里面的重要函数是pthread_mutex_init(),它负责进行互斥锁的初始化,只有初始化之后才能使用它进行加锁、解锁。这里需要说明的是,mutex不仅可以用于进程间的同步,还可以用于线程间的同步,默认情况下是线程间同步。
如果要用于进程间同步,则需要在pthread_mutex_init初始化之前,修改其属性为进程间共享。pthread_mutexattr_t mattr 类型就是用于定义mutex锁的属性的。
mutex的属性修改函数主要有以下几个:
- int pthread_mutexattr_init(pthread_mutexattr_t *attr); 初始化一个mutex属性对象;
- int pthread_mutexattr_setpshared(pthread_mutexattr_t *attr, int pshared); 修改mutex属性;参2:pshared取值:进程锁:PTHREAD_PROCESS_SHARED; 线程锁:PTHREAD_PROCESS_PRIVATE (mutex的默认属性即为线程锁,进程间私有)
- int pthread_mutexattr_destroy(pthread_mutexattr_t *attr); 销毁mutex属性对象 (而非销毁锁)
- int pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutexattr_t *restrict attr); 即将修改后的属性传入该函数,即可产生一个进程锁。
进程间使用互斥量来实现同步的示例:
#include <fcntl.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>
#include <sys/mman.h>
#include <sys/wait.h>
struct mt {
int num;//待保护的临界资源,一个计数
pthread_mutex_t mutex;//互斥锁
pthread_mutexattr_t mutexattr;//互斥锁属性对象,用于设置互斥锁
};
int main(void)
{
int i;
struct mt *mm;
pid_t pid;
/* 文件映射方式创建映射区
int 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) {//子进程,使用getpid()可以获取自己的进程id
for (i = 0; i < 10; i++) {
pthread_mutex_lock(&mm->mutex);
(mm->num)++;
printf("-child----------num++ %dn", mm->num);
pthread_mutex_unlock(&mm->mutex);
sleep(1);
}
} else if (pid > 0) {//父进程,可以使用getpid()获取自己的进程id,同时可以用pid得到子进程 id。一般来说父进程需要控制子进程,所以需要子进程的pid。
for ( i = 0; i < 10; i++) {
sleep(1);
pthread_mutex_lock(&mm->mutex);
mm->num += 2;
printf("-------parent---num+=2 %dn", 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;
}
输出:
[ok@~/test]# ./processMutexTest
-child----------num++ 1
-------parent---num+=2 3
-child----------num++ 4
-------parent---num+=2 6
-child----------num++ 7
-child----------num++ 8
-------parent---num+=2 10
-------parent---num+=2 12
-child----------num++ 13
-------parent---num+=2 15
-child----------num++ 16
-child----------num++ 17
-------parent---num+=2 19
-child----------num++ 20
-------parent---num+=2 22
-child----------num++ 23
-------parent---num+=2 25
-child----------num++ 26
-------parent---num+=2 28
-------parent---num+=2 30
注意:上述方式使用mmap,将临界资源和互斥锁放到了共享内存中,只有这样,两个进程才能同时访问到同一个资源。否则的话,两个进程无法拿到同一个mutex对象。
最后
以上就是无奈蚂蚁为你收集整理的使用互斥锁mutex进行进程间同步的说明和示例的全部内容,希望文章能够帮你解决使用互斥锁mutex进行进程间同步的说明和示例所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复