操作系统:生产者消费者问题
2016-06-06 12:16
281 查看
问题描述:
单个生产者,多个消费者,多个缓冲池,利用多线程通过同步互斥原则完成数据的读取。
解决方案:
生产者与消费者之间涉及同步问题,当缓冲池中有数据时,消费者才能去读取数据;当缓冲池有空余位置时,生产者才能去投进数据。同时又有互斥问题,对缓冲区必须互斥的访问。消费者之间涉及互斥,保证对数据的互斥访问。这里使用了信号量 Semaphore 和关键段 SCRITICAL_SECTION 完成同步和互斥问题。以下给出详细代码:
运行结果:
单个生产者,多个消费者,多个缓冲池,利用多线程通过同步互斥原则完成数据的读取。
解决方案:
生产者与消费者之间涉及同步问题,当缓冲池中有数据时,消费者才能去读取数据;当缓冲池有空余位置时,生产者才能去投进数据。同时又有互斥问题,对缓冲区必须互斥的访问。消费者之间涉及互斥,保证对数据的互斥访问。这里使用了信号量 Semaphore 和关键段 SCRITICAL_SECTION 完成同步和互斥问题。以下给出详细代码:
#include <iostream> #include <process.h> #include <windows.h> // 生产者消费者问题,单个生产者,多个消费者,多个缓冲池 // 使用 信号量 和 关键段 来实现 using namespace std; int gi,gj; const int num = 10; // 产生数据的个数 const int size = 4; // 缓冲池的大小 volatile bool flag = true; // 用于消费者线程之间 int buf[size]; // 缓冲池 CRITICAL_SECTION gc; // 关键段 HANDLE empty,full; // Semaphore unsigned int __stdcall pro(PVOID p) // 生产者线程 { for(int i = 0; i <= num ; i++) { WaitForSingleObject(empty,INFINITE); // 线程同步 EnterCriticalSection(&gc); // 线程互斥 buf[gi] = i; cout << "生产者在 " << gi << " 号缓冲池放入 " << buf[gi] << endl; gi = (gi+1)%size; LeaveCriticalSection(&gc); ReleaseSemaphore(full,1,NULL); } cout << "生产者运行结束!" << endl; return 0; } unsigned int __stdcall cus(PVOID p) // 消费者线程 { while(true) { WaitForSingleObject(full,INFINITE); // 线程同步 if( flag == false ) // 线程之间的逻辑判断 { break; } EnterCriticalSection(&gc); // 线程互斥 cout << "线程 " << GetCurrentThreadId() << " 在缓冲池 " << gj << " 获取数据 " << buf[gj] << endl; if( buf[gj] == num ) // 结束条件 { LeaveCriticalSection(&gc); ReleaseSemaphore(full,1,NULL); flag = false; break; } gj = (gj+1)%size; LeaveCriticalSection(&gc); Sleep(50); ReleaseSemaphore(empty,1,NULL); } cout << "消费者线程 " << GetCurrentThreadId() << " 运行结束!" << endl; return 0; } int main() { // 相关变量的定义 const int sz = 3; gi = gj = 0; InitializeCriticalSection(&gc); empty = CreateSemaphore(NULL,4,4,NULL); full = CreateSemaphore(NULL,0,4,NULL); HANDLE hand[sz]; hand[0] = (HANDLE)_beginthreadex(NULL,0,pro,NULL,0,NULL); // 创建了三个线程 hand[1] = (HANDLE)_beginthreadex(NULL,0,cus,NULL,0,NULL); hand[2] = (HANDLE)_beginthreadex(NULL,0,cus,NULL,0,NULL); WaitForMultipleObjects(sz,hand,true,INFINITE); // 资源的释放 CloseHandle(full); CloseHandle(empty); DeleteCriticalSection(&gc); for(int i = 0; i < sz ; i++) { CloseHandle(hand[i]); } return 0; }
运行结果:
相关文章推荐
- Python3写爬虫(四)多线程实现数据爬取
- 使用 Syncthing 在多个设备间同步文件
- C#实现多线程的同步方法实例分析
- C#数据结构之顺序表(SeqList)实例详解
- 浅谈chuck-lua中的多线程
- Lua教程(七):数据结构详解
- 科学知识:同步、异步、阻塞和非阻塞区别
- 同步文件备份工具 Super Flexible File Synchronizer Pro v4
- 探讨Ajax中同步与异步之间的区别
- C#简单多线程同步和优先权用法实例
- 解析从源码分析常见的基于Array的数据结构动态扩容机制的详解
- PowerShell实现参数互斥示例
- C#多线程学习之(四)使用线程池进行多线程的自动管理
- C#多线程编程中的锁系统(三)
- C#数据结构之队列(Quene)实例详解
- C#数据结构揭秘一
- C#线程同步的三类情景分析
- 解析C#多线程编程中异步多线程的实现及线程池的使用
- C#数据结构之单链表(LinkList)实例详解
- rsync命令使用总结