您的位置:首页 > 编程语言 > C语言/C++

用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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐