用c++实现PV操作(父亲母亲儿子女儿)
2017-12-14 16:53
1856 查看
题目:桌上有一只盘子,每次只能放入1只水果。爸爸专放苹果,妈妈专放橘子,一个儿子专等吃盘子中的橘子,一个女儿专等吃盘子中的苹果。模拟P,V操作实现爸爸、妈妈、儿子、女儿进程的同步控制。
由于我用的是_beginthreadex函数,所以要在编译器里设置Debug Multithreaded DLL
我用的编译器是VC++ 点击project->settings->c/c++,在category下选择code generation,在use run-time liberary下选择Debug Multithreaded DLL
代码如下,自己写的,不怎么样,但肯定能跑起来
#include<string.h>
#include<stdio.h>
#include<windows.h>
#include<process.h>
LPCTSTR sp;//创建信号量ID
LPCTSTR sa;
LPCTSTR so;
HANDLE hp=CreateSemaphore(NULL,1,1,sp);//创建信号量
HANDLE ha=CreateSemaphore(NULL,0,1,sa);
HANDLE ho=CreateSemaphore(NULL,0,1,so);
UINT __stdcall father(LPVOID P)//创建程序
{
WaitForSingleObject(hp,INFINITE);//p操作
printf("父亲放了苹果\n");
Sleep(100);
ReleaseSemaphore(ha,1,NULL);//v操作
return 0;
}
UINT __stdcall mother(LPVOID P)
{
WaitForSingleObject(hp,INFINITE);
printf("母亲放了桔子\n");
Sleep(100);
ReleaseSemaphore(ho,1,NULL);
return 0;
}
UINT __stdcall son(LPVOID P)
{
WaitForSingleObject(ho,INFINITE);
printf("儿子吃了桔子\n");
Sleep(100);
ReleaseSemaphore(hp,1,NULL);
return 0;
}
UINT __stdcall daughter(LPVOID P)
{
WaitForSingleObject(ha,INFINITE);
printf("女儿吃了苹果\n");
Sleep(100);
ReleaseSemaphore(hp,1,NULL);
return 0;
}
int main(int argc, char* argv[])
{
UINT uid;
HANDLE h[10];
h[0]=(HANDLE)::_beginthreadex(NULL,0,father,NULL,0,&uid);
h[1]=(HANDLE)::_beginthreadex(NULL,0,mother,NULL,0,&uid);
h[2]=(HANDLE)::_beginthreadex(NULL,0,son,NULL,0,&uid);
h[3]=(HANDLE)::_beginthreadex(NULL,0,daughter,NULL,0,&uid);
h[4]=(HANDLE)::_beginthreadex(NULL,0,daughter,NULL,0,&uid);
h[5]=(HANDLE)::_beginthreadex(NULL,0,mother,NULL,0,&uid);
h[6]=(HANDLE)::_beginthreadex(NULL,0,mother,NULL,0,&uid);
h[7]=(HANDLE)::_beginthreadex(NULL,0,son,NULL,0,&uid);
h[8]=(HANDLE)::_beginthreadex(NULL,0,father,NULL,0,&uid);
h[9]=(HANDLE)::_beginthreadex(NULL,0,daughter,NULL,0,&uid);
Sleep(1000);
::WaitForMultipleObjects(4,h,TRUE,INFINITE);
for(int i=0;i<10;i++)
::CloseHandle(h[i]);
printf("end");
system("pause");
return 0;
}
由于我用的是_beginthreadex函数,所以要在编译器里设置Debug Multithreaded DLL
我用的编译器是VC++ 点击project->settings->c/c++,在category下选择code generation,在use run-time liberary下选择Debug Multithreaded DLL
代码如下,自己写的,不怎么样,但肯定能跑起来
#include<string.h>
#include<stdio.h>
#include<windows.h>
#include<process.h>
LPCTSTR sp;//创建信号量ID
LPCTSTR sa;
LPCTSTR so;
HANDLE hp=CreateSemaphore(NULL,1,1,sp);//创建信号量
HANDLE ha=CreateSemaphore(NULL,0,1,sa);
HANDLE ho=CreateSemaphore(NULL,0,1,so);
UINT __stdcall father(LPVOID P)//创建程序
{
WaitForSingleObject(hp,INFINITE);//p操作
printf("父亲放了苹果\n");
Sleep(100);
ReleaseSemaphore(ha,1,NULL);//v操作
return 0;
}
UINT __stdcall mother(LPVOID P)
{
WaitForSingleObject(hp,INFINITE);
printf("母亲放了桔子\n");
Sleep(100);
ReleaseSemaphore(ho,1,NULL);
return 0;
}
UINT __stdcall son(LPVOID P)
{
WaitForSingleObject(ho,INFINITE);
printf("儿子吃了桔子\n");
Sleep(100);
ReleaseSemaphore(hp,1,NULL);
return 0;
}
UINT __stdcall daughter(LPVOID P)
{
WaitForSingleObject(ha,INFINITE);
printf("女儿吃了苹果\n");
Sleep(100);
ReleaseSemaphore(hp,1,NULL);
return 0;
}
int main(int argc, char* argv[])
{
UINT uid;
HANDLE h[10];
h[0]=(HANDLE)::_beginthreadex(NULL,0,father,NULL,0,&uid);
h[1]=(HANDLE)::_beginthreadex(NULL,0,mother,NULL,0,&uid);
h[2]=(HANDLE)::_beginthreadex(NULL,0,son,NULL,0,&uid);
h[3]=(HANDLE)::_beginthreadex(NULL,0,daughter,NULL,0,&uid);
h[4]=(HANDLE)::_beginthreadex(NULL,0,daughter,NULL,0,&uid);
h[5]=(HANDLE)::_beginthreadex(NULL,0,mother,NULL,0,&uid);
h[6]=(HANDLE)::_beginthreadex(NULL,0,mother,NULL,0,&uid);
h[7]=(HANDLE)::_beginthreadex(NULL,0,son,NULL,0,&uid);
h[8]=(HANDLE)::_beginthreadex(NULL,0,father,NULL,0,&uid);
h[9]=(HANDLE)::_beginthreadex(NULL,0,daughter,NULL,0,&uid);
Sleep(1000);
::WaitForMultipleObjects(4,h,TRUE,INFINITE);
for(int i=0;i<10;i++)
::CloseHandle(h[i]);
printf("end");
system("pause");
return 0;
}
相关文章推荐
- 在PV操作中会有一个经典的例子就是爸爸妈妈儿子女儿吃水果问题,爸爸妈妈向盘子里放入水果,儿子女儿向盘子取水果。然而爸爸只向盘子放苹果,妈妈只向盘子放橘子,女儿只能吃苹果,儿子只能吃橘子。并且盘子里只能
- 你好,C++(4)2.1.3 我的父亲母亲:编译器和链接器 2.1.4 C++程序执行背后的故事
- 桌上有一空盘,最多允许存放一只水果。爸爸只向盘中放一个苹果,妈妈只向盘中放一个桔子,儿子专等吃盘中的桔子,女儿专等吃苹果。用wait、signal操作实现爸爸、妈妈、儿子、女儿四个并发进程的同步。
- (转载)你好,C++(4)2.1.3 我的父亲母亲:编译器和链接器 2.1.4 C++程序执行背后的故事
- 生产者消费者之爸爸妈妈儿子女儿苹果橘子编程实现
- 父亲 儿子 苹果 女儿 橘子问题
- 生产者消费者之爸爸妈妈儿子女儿苹果橘子编程实现
- 母亲为还赌债卖掉亲儿子 父亲千里迢迢来到温州寻找儿子
- java同步和互斥的应用:生产者消费者之爸爸妈妈儿子女儿苹果橘子编程实现
- 定义父亲类Father(姓lastName,财产property,血型bloodType),儿子Son类(玩游戏PlayGame方法),女儿Daughter类(跳
- 你好,C++(4)2.1.3 我的父亲母亲:编译器和链接器 2.1.4 C++程序执行背后的故事
- 从零开始学C++之模板(四):用模板实现单例模式(线程安全)、模板方式实现动态创建对象
- 用C++实现的一道面试大题-猫狗大战
- 数据结构,图的邻接矩阵创建,邻接矩阵与邻接表的交换,两种表的输出,过程用C++实现
- matlab2c使用c++实现matlab函数系列教程-intersect函数
- 每日进步之leetcode第1题C++实现代码
- 生日悖论扩展引申2-c++代码实现及运行实例结果
- 《算法导论》中的查找任意顺序值的C++实现
- C++基础7【难】 多态:实现原理 vptr指针 证明vptr存在 类的步长 纯虚函数:抽象类 案例 【面试题】
- C++中的接口继承和实现继承