进制间同步机制之mutex
1. Mutex锁可以用于进程间互斥? 当然可以。
a) 使用pthread_mutex_t 来实现进程间的互斥。
b) 当必须支持PTHREAD_PROCESS_SHARED属性
c)其中设置共享对象的属性为PTHREAD_PROCESS_SHARED是为了告诉系统该共享对象是跨越进程的,不仅仅对创建它的进程可见;但是仅有这一个条件显然无法满足不同进程使用该同步对象的需求,因为每个进程的地址空间是独立的,位于一个进程的普通内存区域中的对象是无法被其它进程所访问的,能满足这一要求的内存区域是共享内存,因而同步对象要在进程的共享内存区域内创建。
举例来实现
#include <pthread.h>
#include <sys/mman.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
int main()
{
pthread_mutex_t *pm_mutex = NULL;
pthread_mutexattr_t mutex_shared_attr;
int *p_shared = NULL;
pid_t pid;
//为什么要用mmap映射一个空间呢,因为mmap可以进程间共享内存
pm_mutex = (pthread_mutex_t *)mmap(NULL, sizeof(pthread_mutex_t), PROT_READ | PROT_WRITE,
MAP_SHARED | MAP_ANONYMOUS, -1, 0);
p_shared = (int *)mmap(NULL, sizeof(int), PROT_READ | PROT_WRITE,
MAP_SHARED | MAP_ANONYMOUS, -1, 0);
*p_shared = 0;
pthread_mutexattr_init(&mutex_shared_attr);
pthread_mutexattr_setpshared(&mutex_shared_attr, PTHREAD_PROCESS_SHARED);
pthread_mutex_init(pm_mutex, &mutex_shared_attr);
pid = fork();
if(pid ==0)
{
pthread_mutex_lock(pm_mutex);
for (int i = 0; i< 5; i++)
{
(*p_shared)++;
sleep(1);
printf("child process value is: %d\n", *p_shared);
}
pthread_mutex_unlock(pm_mutex);
return 0;
}else{
pthread_mutex_lock(pm_mutex);
31,14-35 6%