吃苹果问题
首先,父亲放一个苹果在盘,儿子马上取苹果这件事与父亲放一个香蕉,女儿马上取之这件事是互斥的。即在程序中体现在:当父亲每次放水果之后马上唤醒儿子或女儿来取,当一个孩子还没有拿到水果之前,父亲不允许放水果,另外一个孩子也不许来破坏。我们用“临界区”区实现:
父亲函数:
………
进入临界区
放苹果或香蕉
………
儿子或女儿函数:
………
取苹果或香蕉
退出临界区
………..
另外,儿子和女儿在默默等待,只要父亲放了水果他们就拿。程序中表现在:儿女见到盘子没有水果,就被阻塞,父亲每次放水果后唤醒阻塞的孩子函数。我们分别用信息量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++中的多线程同步,这是多线程编程中确保数据安全和正确性的重要概念。我们将深入探讨临界区、互斥量、事件和信号量这四种多线程同步机制。 1. **临界区(Critical Section)**:临界区是多线程...
这个"VC++多线程编程实例集"是为初学者准备的宝贵资源,它包含了一系列已经编译并成功运行的示例,帮助学习者理解和掌握多线程技术。 多线程是计算机程序设计中的一个重要概念,它允许一个应用程序同时执行多个独立...
"VC++多线程管理器_authornop_Vc_"项目提供了一个示例,用于演示如何在VC++中有效地创建、管理和同步多线程。 在多线程编程中,主要涉及以下几个核心概念: 1. **线程创建**:在VC++中,可以使用`CreateThread`...
在编程领域,多线程是一种让程序同时执行多个任务的技术,极大地...通过熟练掌握这些知识点,开发者可以编写出高效、安全的多线程应用程序。在实际开发中,应充分考虑线程安全和性能优化,确保代码的稳定性和可维护性。
**VC++多线程编程详解** 在Windows平台上,VC++(Microsoft Visual C++)是...通过深入理解以上知识点,并结合实际的"vc++多线程例子代码",开发者可以更好地掌握多线程编程技术,从而编写出高效、稳定的多线程应用。
本资料“VC++多线程与多进程编程”专注于利用Microsoft Visual C++(VC++)进行多线程和多进程的实践操作,是初学者掌握这些高级编程概念的理想资源。 首先,我们来理解多线程的概念。线程是操作系统分配处理器时间...
【VC++多线程介绍】 在Windows环境下,Visual Studio提供了对多线程的支持,使得开发者可以构建更加高效、响应迅速的应用程序。多线程技术允许应用程序同时执行多个独立的任务,从而提高了程序的并发性和资源利用率...
在IT行业中,尤其是在软件开发领域,多线程技术是提高程序效率和响应能力的重要手段。...通过学习这些例子,开发者可以深入理解并熟练掌握VC++环境下的多线程编程技巧,从而编写出高效、稳定的多线程应用程序。
在提供的部分文档内容中,包含了对VC++多线程编程的具体实践操作和代码示例,这些内容是我们分析知识点的基础: 1. Win32 SDK和MFC:在提及VC++多线程编程时,我们不可避免地需要了解Win32 SDK(Software ...
### VC++多线程编程方法 #### 一、引言 多线程编程在现代软件开发中占有举足轻重的地位,特别是在需要处理大量计算任务或者实现用户界面响应能力的应用程序中。本篇文章将深入探讨VC++环境下多线程编程的基础知识...
总结来说,VC++多线程编程涉及到线程的创建、管理以及同步,理解并熟练掌握这些概念和技巧对于编写高效、安全的多线程程序至关重要。通过实践例子,如"多线程(包括线程同步).txt"中的内容,你可以更好地理解和应用...
本资源提供的是五个关于VC++多线程和进程编程的实例,旨在帮助开发者深入理解这两个概念以及线程同步控制量的使用。 首先,我们来探讨多线程编程。在单线程程序中,所有任务都按顺序执行,而多线程程序则可以同时...
本文将深入探讨如何在VC++中创建线程,并基于《vc++网络编程经典案例》一书中的示例进行讲解。 线程是操作系统分配CPU时间的基本单元,一个进程可以包含多个线程,每个线程都有自己的执行路径。在VC++中,创建线程...
《VC++编程技巧与示例》是一本专为C++初学者及有一定基础的开发者编写的书籍,旨在帮助读者深入理解和掌握C++编程语言,尤其是针对Microsoft Foundation Classes (MFC) 的应用。这本书内容详尽,涵盖了从基础知识到...
总之,通过这个示例,开发者可以深入理解MFC线程的创建、管理以及与主线程的交互,从而在实际项目中更高效地利用多线程技术,提升程序性能。在实际编程中,我们需要结合Windows API和MFC类库,灵活运用这些知识,以...
理解并熟练运用这些机制,能够帮助开发者编写出高效且线程安全的VC++多线程程序。通过阅读和实践"Thread2_23.zip"、"Thread4_23.zip"、"Thread3_23.zip"中的示例代码,你将更深入地掌握这些同步技术的实际应用。
标题中的“一个别人用vc++写的多线程程序”指的是使用Microsoft Visual C++(简称VC++)编程环境编写的程序,这个程序具有多线程特性。在计算机编程中,多线程是指在一个应用程序中存在多个执行线程,它们可以并发...
【VC++ 高级编程技巧与示例】这个主题涵盖了微软的Visual C++编程环境中的高级技术,包括但不限于模板、异常处理、多线程、内存管理、COM组件、MFC库的深入应用以及Windows API的高级使用等。下面将详细阐述这些知识...
- 编写代码调用控件的启动、停止等方法。 - **示例代码**(部分): ```cpp DAQBoard *board = new DAQBoard("PCL-21713"); board->AnalogInputConfig(0, 10, TRUE, TRUE); ``` **2. 使用动态链接库(DLL)*...
一个实用的VC++多线程下载文件的示例源码,VC++源码下载,请在文本框中输入正确的下载地址,程序判断地址是否正确后,将启动多线程的文件下载机制,为想编写网络下载程序的VC爱好者提供一份源码参考。 运行环境:...