线程之间共享数据,循环队列的疑问 2个线程需要共享数据。线程1:生产线程.负责往队列里面不停添加数据。线程2:消费线程.负责从队列里面不停取走数据,处理。我本意是想设计一个队列来作为缓冲,来处理采集的数据。这2个线程之间需要同步控制么,如何操作为好? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 需要同步,加个锁CriticalSection即可 请参见:http://blog.csdn.net/kyeehttp://blog.csdn.net/kyee增加一个事件即可。 // 队列对象和事件对象TQueue* FQueue;TEvent* FEvent;// 加入数据bool AddData(void* AData){ // 初始化 bool result = false; // 加入队列 if (FQueue->Push(AData)) { FEvent->Set(); result = true; } // 返回结果 return result;}// 取数据函数bool GetData(void* &AData, Longword ATimeout){ // 初始化 bool result = true; // 取队列数据 if (FQueue->Count() != 0) AData = FQueue->Pop(); else { // 等待事件 FEvent->Wait(ATimeout); // 取队列数据 if (FQueue->Count() != 0) AData = FQueue->Pop(); else result = false; } // 返回结果 return result;}// 若处理数据直接放在线程中void DoExecute(TThread* AThread, void* AParam){ // 初始化 void* pData; Longword dwNo, dwCount; // 线程循环体 while (!AThread->Terminated()) { // 等待事件 FEvent->Wait(); // 循环处理队列数据 dwNo = 0; dwCount = FQueue->Count(); while (!AThread->Terminated() && (dwNo++ < dwCount)) { pData = FQueue->Pop(); // 处理数据 // ??? ... ... } }} Event可以,我推荐用信号量CreateSemaphore Event可以,我推荐用信号量CreateSemaphore 楼上有的tx说用事件event。那么event不就是多线程同步的一种方式么?怎么leither同学说不需要呢?迷糊了再请达人指点。 部门的一个同事跟我讲线程之间的切换或者同步控制需要耗费大量的资源,CPU资源耗费很大。我有点纳闷,这种场合下同步控制似乎是必需的,多线程同步控制的CPU资源消耗需要我们程序员去考虑么?难道说消耗真的那么大么?由于这次的项目的确对CPU要求很高,由于是实时处理海量数据,所以我也没底。 采用临界区是耗费资源最低的线程同步方法,当获取临界区成功的时候,不需要进行用户态到内核态的转换,而其他采用内核对象同步方式都必须要进行用户态和内核态的转换。所以推荐使用临界区。但是临界区用不好,容易死锁,因为他没有timeout,所以要小心。 不仅要同步(waitforsingleobject...),而且要互斥(entercriticalsection, leavecriticalsection...)。 浏览器有可能往web服务器发送HTTP回应吗? 没有遗忘的都来报道吧 除DOM还有其它解析XML的SDK吗? 指导一下阿!! 对于listbox该怎样获取其中的内容? 谁能说说3d游戏编程都要掌握哪些知识 MFC 文件保存和读取问题 關于SelectObject的作用? 2001年就要过去,呼吁大家把自己的问题结帐给分(大家UP一下) VC中如何开始网络编程?高手请说话!!! B/S结构下如何限制文件的访问权限和次数? 用CxImage实现一个功能
TQueue* FQueue;
TEvent* FEvent;// 加入数据
bool AddData(void* AData)
{
// 初始化
bool result = false; // 加入队列
if (FQueue->Push(AData))
{
FEvent->Set();
result = true;
} // 返回结果
return result;
}// 取数据函数
bool GetData(void* &AData, Longword ATimeout)
{
// 初始化
bool result = true; // 取队列数据
if (FQueue->Count() != 0)
AData = FQueue->Pop();
else
{
// 等待事件
FEvent->Wait(ATimeout); // 取队列数据
if (FQueue->Count() != 0)
AData = FQueue->Pop();
else
result = false;
} // 返回结果
return result;
}// 若处理数据直接放在线程中
void DoExecute(TThread* AThread, void* AParam)
{
// 初始化
void* pData;
Longword dwNo, dwCount; // 线程循环体
while (!AThread->Terminated())
{
// 等待事件
FEvent->Wait(); // 循环处理队列数据
dwNo = 0;
dwCount = FQueue->Count();
while (!AThread->Terminated() && (dwNo++ < dwCount))
{
pData = FQueue->Pop(); // 处理数据
// ??? ... ...
}
}
}