用c++实现PV操作(父亲母亲儿子女儿)

来源:互联网 发布:二次元人物制作软件 编辑:程序博客网 时间:2024/05/17 02:00

题目:桌上有一只盘子,每次只能放入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;
}