吃苹果问题
首先,父亲放一个苹果在盘,儿子马上取苹果这件事与父亲放一个香蕉,女儿马上取之这件事是互斥的。即在程序中体现在:当父亲每次放水果之后马上唤醒儿子或女儿来取,当一个孩子还没有拿到水果之前,父亲不允许放水果,另外一个孩子也不许来破坏。我们用“临界区”区实现:
父亲函数:
………
进入临界区
放苹果或香蕉
………
儿子或女儿函数:
………
取苹果或香蕉
退出临界区
………..
另外,儿子和女儿在默默等待,只要父亲放了水果他们就拿。程序中表现在:儿女见到盘子没有水果,就被阻塞,父亲每次放水果后唤醒阻塞的孩子函数。我们分别用信息量Apple_和Banana_来作为父亲唤醒儿女和儿女等待的途径。
其中用到的API函数(注意,其具体参数和返回值请参考 VC6.0的 MSDM):
1) WaitForMultipleObjects:等待所有对象的完成,可用于最后主函数的延迟
还可以使用Sleep()让主线程睡觉
2
) InitializeCriticalSection:给临界区初始化
EnterCriticalSection
:进入临界区
LeaveCriticalSection
:退出临界区
3) CreateSemaphore:产生信号量
OpenSemaphore:开始用信号量
WaitForSingleObject:用于信号量的 P原语
ReleaseSemaphore:用于信号量的 V原语
4) CreateThread:产生线程
#include<windows.h>
#include<iostream.h>
#include<time.h>
static int k=0; //for father to list the order of throwing fruit
CRITICAL_SECTION mmutex; //用于互斥的临界区
HANDLE Apple_,Banana_;
DWORD WINAPI Son(LPVOID n)
{
int i = 1;
while (1)
{
::WaitForSingleObject(Apple_,INFINITE);//
等苹果
cout<<"Son eats "<<i<<" apples"<<endl;
LeaveCriticalSection(&mmutex);
i++;
}
::CloseHandle(Apple_);
return 0;
}
DWORD WINAPI Daughter(LPVOID n)
{
int i = 1;
while (1)
{
::WaitForSingleObject(Banana_,INFINITE);//
等香蕉
cout<<"Daughter eats "<<i<<" bananas"<<endl;
LeaveCriticalSection(&mmutex);
i++;
}
::CloseHandle(Banana_);
return 0;
}
DWORD WINAPI Father(LPVOID n)
{
UINT fruit;
EnterCriticalSection(&mmutex);
fruit = rand()%2;
if (fruit == 0)
{
//
盘中放入苹果
cout<<k+1<<" father produce an apple"<<endl;
k=k+1;
::ReleaseSemaphore(Apple_,1,NULL);
}
else {//
盘中放入香蕉
cout<<k+1<<" father produce a banana"<<endl;
k=k+1;
::ReleaseSemaphore(Banana_,1,NULL);
}
return 0;
}
int main()
{
int j;
k=0;
HANDLE Father_[20];
Apple_ = ::CreateSemaphore(NULL,0,1,"apple");
Banana_ =::CreateSemaphore(NULL,0,1,"banana");
InitializeCriticalSection(&mmutex);
srand(time(NULL));
for (j= 0 ; j < 20; j++)
{
Father_[j]=::CreateThread(NULL,0,Father,NULL,0,0);
}
::CreateThread(NULL,0,Son,NULL,0,0);
::CreateThread(NULL,0,Daughter,NULL,0,0);
// Sleep(1000);
WaitForMultipleObjects(20,Father_,TRUE,INFINITE);
return 0;
}
分享到:
相关推荐
一个实用的VC++多线程下载文件的示例源码,VC++源码下载,请在文本框中输入正确的下载地址,程序判断地址是否正确后,将启动多线程的文件下载机制,为想编写网络下载程序的VC爱好者提供一份源码参考。
内容索引:VC/C++源码,网络相关,断点续传,多线程 VC++编写的一个下载程序,专一用来通过HTTP协议下载文件,特点是支持断点续传以及多线程下载。 注意,该程序一次只能下载一个任务,那个列表虽然可以拉很多进去,...
实现了自绘控件,云端控制主要在CnComm类多线程串口通讯库, camerads-DirectShow使用示例 演示了摄像头的使用 CatListBoxDemo ListBox控件与其它控件阙套使用方法 CCAMS系统是一种用于局域网下的CS模式的软件...
一个实用的VC++多线程下载文件的示例源码,VC++源码下载,请在文本框中输入正确的下载地址,程序判断地址是否正确后,将启动多线程的文件下载机制,为想编写网络下载程序的VC爱好者提供一份源码参考。
实现了自绘控件,云端控制主要在CnComm类多线程串口通讯库, camerads-DirectShow使用示例 演示了摄像头的使用 CatListBoxDemo ListBox控件与其它控件阙套使用方法 CCAMS系统是一种用于局域网下的CS模式的软件...
58·多线程方式同时进行多项任务 59·线程优先级示例==赛马 60·利用剪贴板实现exe程序间的数据交换 61·通过内存映射实现exe程序间的数据交换 62·通过消息机制实现exe程序间的数据交换 第七章 63·获取驱动器...
实现了自绘控件,云端控制主要在CnComm类多线程串口通讯库, camerads-DirectShow使用示例 演示了摄像头的使用 CatListBoxDemo ListBox控件与其它控件阙套使用方法 CCAMS系统是一种用于局域网下的CS模式的软件...
实现了自绘控件,云端控制主要在CnComm类多线程串口通讯库, camerads-DirectShow使用示例 演示了摄像头的使用 CatListBoxDemo ListBox控件与其它控件阙套使用方法 CCAMS系统是一种用于局域网下的CS模式的软件...
实现了自绘控件,云端控制主要在CnComm类多线程串口通讯库, camerads-DirectShow使用示例 演示了摄像头的使用 CatListBoxDemo ListBox控件与其它控件阙套使用方法 CCAMS系统是一种用于局域网下的CS模式的软件...
环境:Window XP sp3, JDK 1.6, MyEclipse 5.5 ...代码看上去绝对比VC++的多线程编码优雅。本示例一行注释一行代码,非常详细的说明了怎样使用Java 2D API来编写Java动画应用。 阅读对象:非常熟悉Java基本概念的人员
实现了自绘控件,云端控制主要在CnComm类多线程串口通讯库, camerads-DirectShow使用示例 演示了摄像头的使用 CatListBoxDemo ListBox控件与其它控件阙套使用方法 CCAMS系统是一种用于局域网下的CS模式的软件...
但是,由于各国对Windows操作系统提供了越来越多的支持,因此就更加容易为国际市场生产各种应用软件,从而缩短了软件的美国版本与国际版本推出的时间间隔。 Windows操作系统始终不逾地提供各种支持,以帮助软件开发...
2012-06-11 10:37 151,588 多线程Java Socket编程示例.html 2012-06-11 09:46 56,832 存储管理动态分区分配算法的模拟.doc 2012-06-11 09:45 32,389 完整的串口通信程序VC++源码.7z 2012-06-11 10:41 2,183,866 对...
15.2.2 实例:多线程环境下的数据共享 278 15.3 内核对象与等待函数 280 15.3.1 内核对象 280 15.3.2 等待函数 281 15.4 事件内核对象 283 15.4.1 基本原理 283 15.4.2 实例:使用事件内核对象示例 284 15.5...
15.2.2 实例:多线程环境下的数据共享 278 15.3 内核对象与等待函数 280 15.3.1 内核对象 280 15.3.2 等待函数 281 15.4 事件内核对象 283 15.4.1 基本原理 283 15.4.2 实例:使用事件内核对象示例 284 15.5...
第28章和附录提供了一个XML驱动的在线报纸示例和大量以表格形式给出的相关资料。本书不仅为Internet开发人员提供了详实的开发编程指导,也是致力于Internet网络应用与开发的广大科技人员和大专院校相关专业师生的一...
第28章和附录提供了一个XML驱动的在线报纸示例和大量以表格形式给出的相关资料。本书不仅为Internet开发人员提供了详实的开发编程指导,也是致力于Internet网络应用与开发的广大科技人员和大专院校相关专业师生的一...