问题模型:
初始:S1=1,S2=0;
父进程:P(S2)
print
V(S1)
子进程:P(S1)
print
V(S2)
在不同进程间使用线程上锁的要求:(1)互斥锁变量必须存放在由所有进程共享的内存区中
(2)必须告知线程库函数这是在不同进程之间共享的互斥锁
第一个要求可以使用文件映射技术建立父子进程的共享存储区;第二个要求可以通过设置互斥锁的
PTHREAD_PROCESS_SHARED属性。
-
/*
-
*线程同步对象:互斥量,读写锁,条件变量通常用于线程同步,但这些同步对象都有一个“进程共享属性”,
-
*当对相应同步对象设置了这个属性,这些对象就能用于进程间的控制。
-
*/
-
#include <stdio.h>
-
#include <stdlib.h>
-
#include <pthread.h>
-
#include <fcntl.h>
-
#include <sys/mman.h>
-
-
static pthread_mutex_t *mptr1;//定义两个互斥锁指针分别指向S1,S2
-
static pthread_mutex_t *mptr2;
-
-
int
-
main(int argc,char** argv)
-
{
-
int i,fd;
-
pthread_mutexattr_t mattr1;//互斥锁属性
-
pthread_mutexattr_t mattr2;
-
if(argc<2)
-
return;
-
i=atoi(argv[1]);//交替输出的次数
-
fd=open("/dev/zero",O_RDWR,0);
-
mptr1=mmap(0,2*sizeof(pthread_mutex_t),PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);//建立共享存储区,大小能容纳两个互斥锁,并是第一个互斥锁指针指向共享存储区开始的位置
-
close(fd);
-
mptr2=mptr1+sizeof(pthread_mutex_t);//第二个互斥锁的位置
-
-
pthread_mutexattr_init(&mattr1);//初始化互斥锁的属性
-
pthread_mutexattr_setpshared(&mattr1,PTHREAD_PROCESS_SHARED);//设置互斥锁属性为进程共享
-
pthread_mutex_init(mptr1,&mattr1); //将进程共享属性设置在相应互斥锁上
-
-
pthread_mutexattr_init(&mattr2);//同样设置第二个互斥锁的属性
-
pthread_mutexattr_setpshared(&mattr2,PTHREAD_PROCESS_SHARED);
-
pthread_mutex_init(mptr2,&mattr2);
-
-
pthread_mutex_lock(mptr2); //使S2=0,父进程阻塞,子进程先执行
-
if(fork()==0)
-
{
-
while(i>0)
-
{
-
pthread_mutex_lock(mptr1);//P(S1)
-
-
printf("child:%d\n",i);
-
i--;
-
-
pthread_mutex_unlock(mptr2);//V(S2)
-
}
-
exit(0);
-
}
-
while(i>0)
-
{
-
pthread_mutex_lock(mptr2);//P(S2)
-
-
printf("parent:%d\n",i);
-
i--;
-
-
pthread_mutex_unlock(mptr1);//V(S1)
-
}
-
exit(0);
-
}
运行结果:
阅读(1406) | 评论(0) | 转发(0) |