生产者消费者问题VC语言实现
2018-03-23 12:50
831 查看
源代码如下:
//宏定义
#define BUFFER 20 //缓冲区大小
//头文件 #include<windows.h> #include<stdio.h> #include<iostream> #include<stdlib.h> unsigned short ProductID = 0; //产品号 unsigned short ConsumeID = 0; //将被消耗的产品号 unsigned short in = 0; //产品进缓冲区时的缓冲区下标 unsigned short out = 0; //产品出缓冲区时的缓冲区下标 int g_buffer[BUFFER]; //缓冲区 bool g_continue = true; //控制程序结束 HANDLE g_hMutex; //用于线程间的互斥 HANDLE g_hFullSemaphore; //当缓冲区满时迫使生产者等待 HANDLE g_hEmptySemaphore; //当缓冲区空时迫使消费者等待 DWORD WINAPI Producer(LPVOID); //生产者线程 DWORD WINAPI Consumer(LPVOID); //消费者线程 int main(int argc,char* argv[]) { g_hMutex = CreateMutex(NULL, FALSE, NULL); g_hFullSemaphore = CreateSemaphore(NULL, BUFFER, BUFFER, NULL); g_hEmptySemaphore = CreateSemaphore(NULL, 0, BUFFER, NULL); const unsigned short PRODUCERS_COUNT = 3; //生产者的个数 const unsigned short CONSUMERS_COUNT = 1; //消费者的个数 //总的线程数 const unsigned short THREADS_COUNT = PRODUCERS_COUNT + CONSUMERS_COUNT; HANDLE hThreads[PRODUCERS_COUNT]; //各线程的handle DWORD producerID[CONSUMERS_COUNT]; //生产者线程的标识符 DWORD consumerID[THREADS_COUNT]; //消费者线程的标识符 //创建生产者线程 for (int i = 0; i<PRODUCERS_COUNT; ++i) { hThreads[i] = CreateThread(NULL, 0, Producer, NULL, 0, &producerID[i]); if (hThreads[i] == NULL) { printf("producer %d create failed /n", i); return -1; } } //创建消费者线程 for (int i = 0; i<CONSUMERS_COUNT; ++i) { hThreads[PRODUCERS_COUNT + i] = CreateThread(NULL, 0, Consumer, NULL, 0, &consumerID[i]); if (hThreads[i] == NULL) { printf("consumer %d create failed /n", i); return -1; } } while (g_continue) { char ch = 'a'; ch= getchar(); if (ch == '\n') { g_continue = false; } } return 0; } void print()//输出缓冲区 { int i; printf("\nBuffer:\n"); for (i = 0; i<20; i++) { printf("____"); } printf("\n"); for (i = 0; i<20; i++) printf("|%d|", g_buffer[i]); printf("\n"); for (i = 0; i<20; i++) { printf("----"); } printf("\n"); } //生产一个产品放入缓冲区 void Producer() { ProductID++; g_buffer[in] = ProductID; std::cerr << "Produse " << ProductID << " in " << in; in = (in + 1) % BUFFER; print(); } //生产者线程 DWORD WINAPI Producer(LPVOID lpPara) { while (g_continue) { WaitForSingleObject(g_hFullSemaphore, INFINITE); WaitForSingleObject(g_hMutex, INFINITE); Producer(); Sleep(1500); ReleaseMutex(g_hMutex); ReleaseSemaphore(g_hEmptySemaphore, 1, NULL); } return 0; } //消费者消费一个产品 void consumer() { ConsumeID = g_buffer[out]; std::cerr << "Consumer " << g_buffer[out]<<" from "<<out; g_buffer[out] = 0; out = (out + 1) % BUFFER; print(); } //消费者线程 DWORD WINAPI Consumer(LPVOID lpPara) { while (g_continue) { WaitForSingleObject(g_hEmptySemaphore, INFINITE); WaitForSingleObject(g_hMutex, INFINITE); consumer(); Sleep(1500); ReleaseMutex(g_hMutex); ReleaseSemaphore(g_hFullSemaphore, 1, NULL); } return 0; }
运行截图:
相关文章推荐
- 用vc实现生产者消费者问题
- 用vc实现生产者消费者问题
- 生产者消费者问题VC实现
- 用vc实现生产者消费者问题
- 用vc实现生产者消费者问题(转载)
- 生产者-消费者问题(condition)Java实现
- 生产者-消费者问题实现 (linux下C语言)
- .net实现--多线程之生产者/消费者问题
- 生产者-消费者问题【Java实现】
- 用JAVA 实现“生产者-消费者”问题
- 生产者-消费者问题实现 使用信号量
- java生产者和消费者问题之售票实现方法
- vc实现的 生成者,消费者问题
- java实现 生产者和消费者问题 多线程同步示例
- 用JAVA 实现“生产者-消费者”问题
- C语言实现生产者-消费者问题
- 生产者消费者问题之Java线程实现
- 生产者消费者问题的java实现
- Java 线程同步问题 生产者-消费者 算法实现 -Java学习笔记(29)
- 生产者/消费者问题的多种Java实现方式