操作系统-信号量C++代码WIN32
2015-07-12 17:20
549 查看
#include <windows.h> #include <random> #include <cstring> #include <ctime> #include <cstdio> #define BUFFER_SIZE 5 int buffer[BUFFER_SIZE]; int cnt=0; HANDLE Mutex,Empty,Full; void init() { Mutex=CreateMutex(NULL,FALSE,NULL); Empty=CreateSemaphore(NULL,5,5,NULL); Full=CreateSemaphore(NULL,0,5,NULL); } int insert_item(int item,int order) { int flag=-1; WaitForSingleObject(Empty,INFINITE); WaitForSingleObject(Mutex,INFINITE); if(cnt<BUFFER_SIZE) { buffer[cnt++]=item; flag=0; printf("producer %d producer %d\n",order,cnt); } ReleaseMutex(Mutex); ReleaseSemaphore(Full,1,NULL); return flag; } int remove_item(int &item,int order) { int flag=-1; WaitForSingleObject(Full,INFINITE); WaitForSingleObject(Mutex,INFINITE); if(cnt>0) { item=buffer[cnt-1]; buffer[cnt-1]=0; flag=0; printf("consumer %d consumed %d\n",order,cnt); cnt--; } ReleaseMutex(Mutex); ReleaseSemaphore(Empty,1,NULL); return flag; } DWORD WINAPI producer(void *param) { srand((unsigned)time(NULL)); int random; while(true) { Sleep((rand()%10+1)*1000); if(insert_item(random,(DWORD)param)) { printf("report error condition\n"); } } } DWORD WINAPI consumer(void *param) { srand((unsigned)time(NULL)); int random; while(true) { Sleep((rand()%10+1)*1000); if(remove_item(random,(DWORD)param)) { printf("report error condition\n"); } } } int main(int argc,char *argv[]) { init(); static const int sleepTime=1000,producerThs=10,consumerThs=10; memset(buffer,0,sizeof buffer); DWORD ProducerThreadId[producerThs],ConsumerThreadId[consumerThs]; HANDLE ProducerThreadHandles[producerThs],ConsumerThreadHandles[consumerThs]; int i; for(i=0;i<producerThs;i++) { ProducerThreadHandles[i]=CreateThread(NULL,0,producer,(LPVOID)i,0,&ProducerThreadId[i]); } for(i=0;i<consumerThs;i++) { ConsumerThreadHandles[i]=CreateThread(NULL,0,consumer,(LPVOID)i,0,&ConsumerThreadId[i]); } Sleep(sleepTime); for(i=0;i<producerThs;i++) { CloseHandle(ProducerThreadHandles[i]); CloseHandle(ConsumerThreadHandles[i]); } return 0; }
相关文章推荐
- c++ 容器基本方法
- C++ : 引用的实质理解 !!!!
- c++引用与指针的区别(着重理解)
- C&C++函数指针
- 移动开发、C/C++、算法、程序员人生
- Kth Smallest Element in a BST
- Palindrome Linked List
- C语言的设计模式-接口隔离
- C语言,文件
- C语言学习笔记——动态内存分配
- C语言 if语句的总结(2)附:用if实现加减运算复习用
- C语言中函数
- C语言宏定义
- C语言中的字符串操作
- C语言 gets()和scanf()函数的区别
- C++中一个类究竟占用多少内存
- C语言之基本算法30—数组的灵活应用(一个正整数的各位数字平方和)
- Embedded_SW_模块化]嵌入式C语言工程文件组织_保持更新
- C语言之基本算法29—整数任意次方的最后三位数(精度问题)
- C++ static关键字详细应用指南