stl queue多线程读写问题请教高手

双木成林028 2015-04-16 10:28:36
现有一个queue,两个线程写,一个线程读。
进队操作如下:
	
EnterCriticalSection(&criMsgQueue);
queueCtpMsg.push(pMsg);
LeaveCriticalSection(&criMsgQueue);


出队操作如下:

while (!queueCtpMsg.empty())
{
CtpMsgStruct* pMsg = queueCtpMsg.front();
EnterCriticalSection(&criMsgQueue);
queueCtpMsg.pop();
LeaveCriticalSection(&criMsgQueue);
}


运行一会儿报deque iterator not dereferencable错误;

出队操作后改为:

while (!queueCtpMsg.empty())
{
EnterCriticalSection(&criMsgQueue);
CtpMsgStruct* pMsg = queueCtpMsg.front();
queueCtpMsg.pop();
LeaveCriticalSection(&criMsgQueue);
}

错误消失。

我的疑问是:CtpMsgStruct* pMsg = queueCtpMsg.front();这一句,只是读取frout()的值,而且读之前是有判断列队是否为空的。为毛要放到临界区里面去。
...全文
210 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
笨笨仔 2015-04-16
  • 打赏
  • 举报
回复
MFC好像都放弃“queue”了。将保存数据与读在一个线程中,写为另外的独立线程,通过消息机制(就是队列)进行数据保存,如果读出后数据不需要了,就读出一条处理后即丢掉。
yaozhiyong110 2015-04-16
  • 打赏
  • 举报
回复
CtpMsgStruct* pMsg = queueCtpMsg.front(); std不是线程安全的 你front的时刻内存在push后可能整块内存都移动到另一个空间了(就是说push操作是会引起整个队列的内存进行迁移的) 导致front操作的 iterator 已经是失效的了...
worldy 2015-04-16
  • 打赏
  • 举报
回复
queueCtpMsg.front();在进队的时候应该会修改内部数据

15,471

社区成员

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

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