大家指点一下,有没哟错误,隐患啊呵呵
#include<deque>
using std::deque;#include<iostream>
using std::cout;
using std::endl; int const BUFFER_MAX_SIZE =10;deque<int>dq(BUFFER_MAX_SIZE); //BUFFER_MAX_SIZE个大小的缓冲区class CritHelper
{
临界区帮助类 raii
};class CritHelpIO //std::cout,std::endl; 防止 生产者,消费者以外的线程使用
{raii;
};//初始化数据,子线程以外先调用
void InitData()
{
deque<int>::iter =dq.begin();for(int i=1;(i<=BUFFER_MAX_SIZE )&& (iter!= dq.end()); i++)
{
*iter=0;
}}
//队列中添加数据
void put(int n)
{
CritHelper ch;if(dq.size()==BUFFER_MAX_SIZE) //满了
{
while(1){}; //等到有空位{
CritHelpIO chi;cout<<"进入的数据位:"<<n<<endl;}dq.push_back(n);}}
//获取数据
int get()
{CritHelper ch;if(dq.empty()) //空
{
while(1){}; //等到有数据{
CritHelpIO chi;cout<<"取出的数据位:"<<dq.front()<<endl;}dq.pop_front();}}
void Produce(int n)
{
for( int i=0 ;i<n ; i++)
{
put(i);
}
}
void Consumer(int n)
{
for( int i=0 ;i<n ; i++)
{
get();}}
#include<deque>
using std::deque;#include<iostream>
using std::cout;
using std::endl; int const BUFFER_MAX_SIZE =10;deque<int>dq(BUFFER_MAX_SIZE); //BUFFER_MAX_SIZE个大小的缓冲区class CritHelper
{
临界区帮助类 raii
};class CritHelpIO //std::cout,std::endl; 防止 生产者,消费者以外的线程使用
{raii;
};//初始化数据,子线程以外先调用
void InitData()
{
deque<int>::iter =dq.begin();for(int i=1;(i<=BUFFER_MAX_SIZE )&& (iter!= dq.end()); i++)
{
*iter=0;
}}
//队列中添加数据
void put(int n)
{
CritHelper ch;if(dq.size()==BUFFER_MAX_SIZE) //满了
{
while(1){}; //等到有空位{
CritHelpIO chi;cout<<"进入的数据位:"<<n<<endl;}dq.push_back(n);}}
//获取数据
int get()
{CritHelper ch;if(dq.empty()) //空
{
while(1){}; //等到有数据{
CritHelpIO chi;cout<<"取出的数据位:"<<dq.front()<<endl;}dq.pop_front();}}
void Produce(int n)
{
for( int i=0 ;i<n ; i++)
{
put(i);
}
}
void Consumer(int n)
{
for( int i=0 ;i<n ; i++)
{
get();}}
解决方案 »
- MFC 获取属性页的控件值
- 高手请进:怎么设置菜单的大小?
- 从CWinApp中派生的类中,一个函数内的临时变量release版中都无效了!没天理呀!这还叫我怎么写程序呀!!!!!!!!!!!!(只有50分了!)
- 急!!将窗口客户区保存为位图
- 如何把日期类型字段值转换成字符串类型?
- 急!---如何取得程序的菜单选项?
- 大虾帮忙看看
- 问一个久悬未决的问题,2000下如何得到主板的序列号
- 哪位大侠能告诉我MFC中的subclassing或CWnd::SubClassDlgItem的含义和意义?
- 请问下VC中用ODBC连接数据库,但是打不开表如何解决?
- MFC更改button上的内容为什么失败
- 程序运行是出错 虚心求教
CritHelper ch; 不知是不是伪代码?局部的临界?这样用不行的吧
while(1){};不合理,会耗尽CPU,单线程下用,直接挂掉
while(1)是表示等待的意思啊
上完整代码:#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 InitData()
{
deque<int>::iterator iter =dq.begin(); for(int i=1;(i<=BUFFER_MAX_SIZE )&& (iter!= dq.end()); i++)
{
*iter=0;
}}
//队列中添加数据
void put(int n)
{
CritHelper ch; if(dq.size()==BUFFER_MAX_SIZE) //满了
{
while(1){}; //等到有空位 } {
CritHelpIO chi; cout<<"进入的数据位:"<<n<<endl; } dq.push_back(n);}
//获取数据
void get()
{ int val; CritHelper ch; if(dq.empty()) //空
{
while(1){}; //等到有数据 } 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;}
1.InitData这个函数 基本报废了看 2楼2. 我实现了代码,你看对不对3,while(1);为什么不合理,难道 ::Sleep(几秒钟) ????
deque<int>::iterator iter =dq.begin(); for(; iter!= dq.end(); iter++) //这样就可以了,不要搞太复杂
{
*iter=0;
}while(1)用错了
正确的应是
while(dq.empty()); //空,等到有数据
while(dq.size() == BUFFER_MAX_SIZE); //满了,等到有空位不过不建议这么做
while(表达式); 这个无法预测结束时机,可能一直死循环,会消耗大量CPU资源
可以加Sleep(0),但还是不够理想
raii用法错
CritHelper ch;
CritHelpIO chi;
都是局部对象,注意其生存期(只在函数内或函数某代码块内),不能起到全局临界的作用(这里的函数都是全局 )
而且有大错误就是在构造里InitializeCriticalSection、在析构里DeleteCriticalSection正确用法是
建一个CCriticalSection类,构造里InitializeCriticalSection,析构里DeleteCriticalSection,并且要保证CRITICAL_SECTION cs的生存期有效(如要放在全局区里)
CritHelper只负责EnterCriticalSection和LeaveCriticalSection
//队列中添加数据
void put(int n)
{
CritHelper ch; if(dq.size()==BUFFER_MAX_SIZE) //满了
{
while(1){}; //等到有空位 }
不知道何时有有空位, Sleep的话,但是时间不好设置。
1个生产者 1个消费者。
g_hFullSemaphore = CreateSemaphore(NULL,1,1,NULL);
g_hEmptySemaphore = CreateSemaphore(NULL,0,1,NULL); //生产者
DWORD WINAPI Producer(LPVOID lpPara)
{
while(g_continue){
WaitForSingleObject(g_hFullSemaphore,INFINITE);
WaitForSingleObject(g_hMutex,INFINITE);
Produce();
Append();
Sleep(1500);
ReleaseMutex(g_hMutex);
ReleaseSemaphore(g_hEmptySemaphore,1,NULL); //唤醒消费者
}
return 0;
} //消费者
DWORD WINAPI Consumer(LPVOID lpPara)
{
while(g_continue){
WaitForSingleObject(g_hEmptySemaphore,INFINITE);
WaitForSingleObject(g_hMutex,INFINITE);
Take();
Consume();
Sleep(1500);
ReleaseMutex(g_hMutex);
ReleaseSemaphore(g_hFullSemaphore,1,NULL); //唤醒生产者
}
return 0;
}