使用线程互斥量,实现进程的PV操作
来源:互联网 发布:手机淘宝怎么改评价啊 编辑:程序博客网 时间:2024/04/28 11:42
问题模型:
初始:S1=1,S2=0;
父进程:P(S2)
print
V(S1)
子进程:P(S1)
print
V(S2)
在不同进程间使用线程上锁的要求:(1)互斥锁变量必须存放在由所有进程共享的内存区中
(2)必须告知线程库函数这是在不同进程之间共享的互斥锁
第一个要求可以使用文件映射技术建立父子进程的共享存储区;第二个要求可以通过设置互斥锁的
PTHREAD_PROCESS_SHARED属性。转载请尊重原创、保留相关链接本文来自多宝平台:http://www.mbodb.com
运行结果:
初始:S1=1,S2=0;
父进程:P(S2)
V(S1)
子进程:P(S1)
V(S2)
在不同进程间使用线程上锁的要求:(1)互斥锁变量必须存放在由所有进程共享的内存区中
(2)必须告知线程库函数这是在不同进程之间共享的互斥锁
第一个要求可以使用文件映射技术建立父子进程的共享存储区;第二个要求可以通过设置互斥锁的
PTHREAD_PROCESS_SHARED属性。转载请尊重原创、保留相关链接本文来自多宝平台:http://www.mbodb.com
点击(此处)折叠或打开
- /*
- *线程同步对象:互斥量,读写锁,条件变量通常用于线程同步,但这些同步对象都有一个“进程共享属性”,
- *当对相应同步对象设置了这个属性,这些对象就能用于进程间的控制。
- */
- #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);
- }
运行结果:
0 0
- 使用线程互斥量,实现进程的PV操作
- 使用线程互斥量,实现进程的PV操作
- 使用线程互斥量,实现进程的PV操作
- 信号量实现线程之间的PV操作
- Java入门到精通——基础篇之多线程实现简单的PV操作的进程同步
- Java入门到精通——基础篇之多线程实现简单的PV操作的进程同步
- Java入门到精通——基础篇之多线程实现简单的PV操作的进程同步
- 进程的PV操作及互斥同步实现
- 为什么pv操作能实现进程的互斥???
- 锁、PV操作、进程互斥与同步的实现
- 线程的信号量 PV操作
- 线程间的pv操作
- 进程间的相互作用PV操作
- Operating System-进程/线程内部通信-信号量、PV操作的实现和应用(解决哲学家进餐和生产者消费者问题)
- pv操作实现多进程同步和互斥
- 用PV操作解决经典进程同步问题 C#实现
- 线程&PV操作以及实现生产消费者问题
- 关于操作系统中pv操作的实现
- C++ MFC控件随着窗口大小变化而自适应
- Azure的安全性
- [leetcode]Letter Combinations of a Phone Number
- return 0 与exit(0)
- 数据库服务器参数优化mycnf,16G内存8核CPU,
- 使用线程互斥量,实现进程的PV操作
- OC基础教程——笔记
- FMS (端口问题)如何穿透防火墙
- DM816x算法详解--之OSD
- 如何用linux终端发送邮件
- jQuery中this与$(this)的区别
- lua闭包,ios block,C++lambda函数
- 在两个ENGINE为InnoDB的table执行增加外键的语句时出错
- 2440MMU_Init.c 简要分析