`
gstarwd
  • 浏览: 1489440 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

VC++多线程编写示例

    博客分类:
  • VC++
阅读更多

吃苹果问题

首先,父亲放一个苹果在盘,儿子马上取苹果这件事与父亲放一个香蕉,女儿马上取之这件事是互斥的。即在程序中体现在:当父亲每次放水果之后马上唤醒儿子或女儿来取,当一个孩子还没有拿到水果之前,父亲不允许放水果,另外一个孩子也不许来破坏。我们用“临界区”区实现:
 父亲函数:
       ………
      进入临界区
      放苹果或香蕉
      ………
 儿子或女儿函数:
     ………
      取苹果或香蕉
      退出临界区
     ………..
另外,儿子和女儿在默默等待,只要父亲放了水果他们就拿。程序中表现在:儿女见到盘子没有水果,就被阻塞,父亲每次放水果后唤醒阻塞的孩子函数。我们分别用信息量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爱好者提供一份源码参考。

    vc++ 基于HTTP协议的断点续传和多线程下载示例

    内容索引:VC/C++源码,网络相关,断点续传,多线程 VC++编写的一个下载程序,专一用来通过HTTP协议下载文件,特点是支持断点续传以及多线程下载。  注意,该程序一次只能下载一个任务,那个列表虽然可以拉很多进去,...

    vc++ 应用源码包_3

    实现了自绘控件,云端控制主要在CnComm类多线程串口通讯库, camerads-DirectShow使用示例 演示了摄像头的使用 CatListBoxDemo ListBox控件与其它控件阙套使用方法 CCAMS系统是一种用于局域网下的CS模式的软件...

    Download_Vc_

    一个实用的VC++多线程下载文件的示例源码,VC++源码下载,请在文本框中输入正确的下载地址,程序判断地址是否正确后,将启动多线程的文件下载机制,为想编写网络下载程序的VC爱好者提供一份源码参考。

    vc++ 应用源码包_1

    实现了自绘控件,云端控制主要在CnComm类多线程串口通讯库, camerads-DirectShow使用示例 演示了摄像头的使用 CatListBoxDemo ListBox控件与其它控件阙套使用方法 CCAMS系统是一种用于局域网下的CS模式的软件...

    VC++6.0实效编程百例

    58·多线程方式同时进行多项任务 59·线程优先级示例==赛马 60·利用剪贴板实现exe程序间的数据交换 61·通过内存映射实现exe程序间的数据交换 62·通过消息机制实现exe程序间的数据交换 第七章 63·获取驱动器...

    vc++ 应用源码包_5

    实现了自绘控件,云端控制主要在CnComm类多线程串口通讯库, camerads-DirectShow使用示例 演示了摄像头的使用 CatListBoxDemo ListBox控件与其它控件阙套使用方法 CCAMS系统是一种用于局域网下的CS模式的软件...

    vc++ 应用源码包_2

    实现了自绘控件,云端控制主要在CnComm类多线程串口通讯库, camerads-DirectShow使用示例 演示了摄像头的使用 CatListBoxDemo ListBox控件与其它控件阙套使用方法 CCAMS系统是一种用于局域网下的CS模式的软件...

    vc++ 应用源码包_6

    实现了自绘控件,云端控制主要在CnComm类多线程串口通讯库, camerads-DirectShow使用示例 演示了摄像头的使用 CatListBoxDemo ListBox控件与其它控件阙套使用方法 CCAMS系统是一种用于局域网下的CS模式的软件...

    Java2D编程--著名的Java大手动画

    环境:Window XP sp3, JDK 1.6, MyEclipse 5.5 ...代码看上去绝对比VC++的多线程编码优雅。本示例一行注释一行代码,非常详细的说明了怎样使用Java 2D API来编写Java动画应用。 阅读对象:非常熟悉Java基本概念的人员

    vc++ 开发实例源码包

    实现了自绘控件,云端控制主要在CnComm类多线程串口通讯库, camerads-DirectShow使用示例 演示了摄像头的使用 CatListBoxDemo ListBox控件与其它控件阙套使用方法 CCAMS系统是一种用于局域网下的CS模式的软件...

    VC++6.0核心编程源码.rar

    但是,由于各国对Windows操作系统提供了越来越多的支持,因此就更加容易为国际市场生产各种应用软件,从而缩短了软件的美国版本与国际版本推出的时间间隔。 Windows操作系统始终不逾地提供各种支持,以帮助软件开发...

    vc代码合集

    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 对...

    Windows编程循序渐进.part2

    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...

    Windows编程循序渐进.part3

    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...

    ASP3《高级编程》(第一部分)

    第28章和附录提供了一个XML驱动的在线报纸示例和大量以表格形式给出的相关资料。本书不仅为Internet开发人员提供了详实的开发编程指导,也是致力于Internet网络应用与开发的广大科技人员和大专院校相关专业师生的一...

    ASP3《高级编程》(第二部分)

    第28章和附录提供了一个XML驱动的在线报纸示例和大量以表格形式给出的相关资料。本书不仅为Internet开发人员提供了详实的开发编程指导,也是致力于Internet网络应用与开发的广大科技人员和大专院校相关专业师生的一...

Global site tag (gtag.js) - Google Analytics