多线程同时写队列问题, 在线等,一定结贴,顶者有分!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

hamimelon 2005-08-30 11:39:47
多个线程在同一时刻对一个队列进行写处理,我加了锁,可是CPU的占用率达100%
4个线程的时候没问题,CPU占用率不高10%左右
可是8个或更多线程的时候CPU的占用率就高达100%,但对队列还是正常能写数据


请问那位大侠有个这方面的经验,能解决CPU耗用的问题,多谢!
...全文
164 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
hamimelon 2005-08-30
  • 打赏
  • 举报
回复

线程是一个回调函数

我用的是ACE的队列,它会自锁的
大致代码

void CALLBACK readNetStreamCallBack_TM2(void *context, DWORD nChannel, PBYTE pBuff, DWORD Len)
{
....
RecordFileInfo mFileInfo; //一个结构体信息
mFileInfo.nChannel = nChannel;
ACE_OS::strcpy(mFileInfo.szFileName,sFileName);
g_database_task.put_q(&mFileInfo, sizeof(mFileInfo)); //入队,如果我去掉这句话,
//程序所耗CPU就很少,
....
}


//线程入队函数
int GE_Database_Task::put_q(void *param, size_t size)
{
ACE_Message_Block *mb;
if (size == 0)
{
ACE_NEW_RETURN (mb, ACE_Message_Block(size,ACE_Message_Block::MB_STOP),0);
}
else
{
ACE_NEW_RETURN (mb, ACE_Message_Block(size),0);
mb->copy((const char *)param, size);
}

if (this->putq(mb) == -1)

{
mb->release();
}
mb = NULL;


return 0;}
dirdirdir3 2005-08-30
  • 打赏
  • 举报
回复
检测一下线程是否都进入挂起的状态了。
goodboyws 2005-08-30
  • 打赏
  • 举报
回复
和线程数目关系很大么,代码拿来看看
JonneyR 2005-08-30
  • 打赏
  • 举报
回复
不太了解,学习了,顺便顶一下
DentistryDoctor 2005-08-30
  • 打赏
  • 举报
回复
代码呢?

线程不要弄成"Busy loop"哟!
Tranquillo 2005-08-30
  • 打赏
  • 举报
回复
用spy++看看你那些线程的状态
不知道你用的什么锁定方法,换一种锁定方法看看
younggle 2005-08-30
  • 打赏
  • 举报
回复
把主要代码贴出来。
线程里面注意Sleep
casinosun 2005-08-30
  • 打赏
  • 举报
回复
线程多了,再等待,cpu应该高

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧