早下好,小弟我问个 不用信号量 实现 生产者-消费者模型的有关问题
早上好,我问个 不用信号量 实现 生产者---消费者模型的问题
2个生产者,1个消费者,
这是我写的
有什么问题吗
------解决方案--------------------
你自己遇到什么问题了嘛??
------解决方案--------------------
你这里对于队列的操作起不到同步的作用
- C/C++ code
#include "stdafx.h" #include <process.h> #include <windows.h> #include<deque> using std::deque; #include<iostream> using std::cout; using std::endl; int const BUFFER_MAX_SIZE =10; //BUFFER_MAX_SIZE个大小的缓冲区 deque<int>dq; class CritHelper { //临界区帮助类 raii CRITICAL_SECTION cs; public: CritHelper() { ::InitializeCriticalSection(&cs); ::EnterCriticalSection(&cs); } ~CritHelper() { ::LeaveCriticalSection(&cs); ::DeleteCriticalSection(&cs); } }; class CritHelpIO { //临界区帮助类 raii CRITICAL_SECTION cs; public: CritHelpIO() { ::InitializeCriticalSection(&cs); ::EnterCriticalSection(&cs); } ~CritHelpIO() { ::LeaveCriticalSection(&cs); ::DeleteCriticalSection(&cs); } }; //队列中添加数据 void put(int n) { CritHelper ch; if(dq.size()==BUFFER_MAX_SIZE) //满了 { // while(1){}; //等到有空位 ::Sleep(2); } { CritHelpIO chi; cout<<"进入的数据位:"<<n<<endl; } dq.push_back(n); } //获取数据 void get() { int val; CritHelper ch; if(dq.empty()) //空 { // while(1){}; //等到有数据 ::Sleep(2); } val=dq.front(); { CritHelpIO chi; cout<<"取出的数据位:"<<val<<endl; } dq.pop_front(); } unsigned int _stdcall Produce(VOID* n) { int*p =(int*)n; for( int i=0 ;i<*p ; i++) { put(i); } return 0; } unsigned int _stdcall Consumer(VOID* n) { int *p=(int*)n; for( int i=0 ;i<*p ; i++) { get(); } return 0; } int main() { int val=10; HANDLE hWnd1=(HANDLE)_beginthreadex(NULL,0,Produce,&val,0,NULL); HANDLE hWnd2=(HANDLE)_beginthreadex(NULL,0,Produce,&val,0,NULL); int val2=20; HANDLE hWnd3=(HANDLE)_beginthreadex(NULL,0,Consumer,&val2,0,NULL); Sleep(50000); return 0; }
2个生产者,1个消费者,
这是我写的
有什么问题吗
------解决方案--------------------
你自己遇到什么问题了嘛??
------解决方案--------------------
你这里对于队列的操作起不到同步的作用