求解决boost::condition_variable_any 问题的解决办法

TheNewIpad 2014-02-20 10:39:59
处于跨平台考虑, 在编写一个生产者消费者队列时, 使用了Boost::condition_variable_any, 发现了如下问题。

// 开始保护消费者操作消费者队列的数据。
boost::unique_lock<boost::recursive_mutex> Lock (m_mtxConsumerListAccess);

// 如果没有可消费内容,则等待生产出新的消费项。 如果等待超时时,还没出现,则返回失败。
if(可消费数量 == 0 && !m_cndConsumerListAvailable.timewait(Lock, 20) )
{
return false;
}

// ......

上述代码需要用到消息通知机制,使用了cndConsumerListAvailable, 该变量依赖锁。 这就导致了事件和锁居然相互搀和到一块了。 如果出现可消费数量为0现象,必然会降低系统运行效率。

求boost中,事件和锁分开的通知事件方法。
...全文
291 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
TheNewIpad 2014-02-21
  • 打赏
  • 举报
回复
引用 5 楼 mujiok2003 的回复:
[quote=引用 3 楼 TheNewIpad 的回复:] [quote=引用 2 楼 mujiok2003 的回复:] 条件变量本来就是和lock配合使用的,为啥要分开
考虑下, 消费者没有数据时候,等待生产者生产数据时给予通知。 这个时候,他根本没有必要占用锁。 相反由于消费者占用了锁,导致生产者不能执行后续代码。 所以要分开啊。[/quote] 你没有理解con.wait(lock,...), 如条件不满足, 会先解锁, 再等待条件被满足。 等条件满足, 会上锁,再从wait返回。 [/quote] 看了手册和源代码,的确如此。 可问题是,我传入不同的超时时间,表现却不同。 郁闷。
mujiok2003 2014-02-20
  • 打赏
  • 举报
回复
引用 3 楼 TheNewIpad 的回复:
[quote=引用 2 楼 mujiok2003 的回复:] 条件变量本来就是和lock配合使用的,为啥要分开
考虑下, 消费者没有数据时候,等待生产者生产数据时给予通知。 这个时候,他根本没有必要占用锁。 相反由于消费者占用了锁,导致生产者不能执行后续代码。 所以要分开啊。[/quote] 你没有理解con.wait(lock,...), 如条件不满足, 会先解锁, 再等待条件被满足。 等条件满足, 会上锁,再从wait返回。
TheNewIpad 2014-02-20
  • 打赏
  • 举报
回复
引用 1 楼 vipcxj 的回复:
像m_cndConsumerListAvailable这种用来判断的变量根本没必要用锁,就算用锁,也就在单单只写这一个变量前加锁,写完就解锁,花不了多少时间
您这没看清楚, 之所以加锁,是因为事件通知依赖锁。。
TheNewIpad 2014-02-20
  • 打赏
  • 举报
回复
引用 2 楼 mujiok2003 的回复:
条件变量本来就是和lock配合使用的,为啥要分开
考虑下, 消费者没有数据时候,等待生产者生产数据时给予通知。 这个时候,他根本没有必要占用锁。 相反由于消费者占用了锁,导致生产者不能执行后续代码。 所以要分开啊。
mujiok2003 2014-02-20
  • 打赏
  • 举报
回复
vipcxj 2014-02-20
  • 打赏
  • 举报
回复
像m_cndConsumerListAvailable这种用来判断的变量根本没必要用锁,就算用锁,也就在单单只写这一个变量前加锁,写完就解锁,花不了多少时间

5,530

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 模式及实现
社区管理员
  • 模式及实现社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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