关于 boost::condition_variable的使用,求高手解答????

zhouzhipen 2013-11-05 09:15:42
从网上找到的生产者消费者队列代码,基于boost的条件变量实现的。
段代码横看树看也没有什么问题,于是在正式的项目中使用了。但结果很受伤,出现了严重的资源泄露,
以上不知道是我的使用方法有问题,还是BOOST本身的BUG,望大家指导。

调试发现:
主要表现为同步对象泄露,
问题代码行:the_condition_variable.wait(lock);

编译环境:
VS2008
boost版本1.52

运行环境:
Windows Server 2003 23位
内存8G

附上源代码:

template<typename Data>
class concurrent_queue
{
private:
std::queue<Data> the_queue;
mutable boost::mutex the_mutex;
boost::condition_variable the_condition_variable;
public:
void push(Data const& data)
{
boost::mutex::scoped_lock lock(the_mutex);
the_queue.push(data);
lock.unlock();
the_condition_variable.notify_one();
}
bool empty() const
{
boost::mutex::scoped_lock lock(the_mutex);
return the_queue.empty();
}
bool try_pop(Data& popped_value)
{
boost::mutex::scoped_lock lock(the_mutex);
if(the_queue.empty())
{
return false;
}

popped_value=the_queue.front();
the_queue.pop();
return true;
}
void wait_and_pop(Data& popped_value)
{
boost::mutex::scoped_lock lock(the_mutex);
while(the_queue.empty())
{
the_condition_variable.wait(lock);
}

popped_value=the_queue.front();
the_queue.pop();
}
};

原文:http://www.cnblogs.com/sanjin/archive/2012/08/09/2629890.html
...全文
593 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
yiquanshui 2014-06-27
  • 打赏
  • 举报
回复
在ogre里遇到同样的问题,只好把notify_one改成了notify_all
  • 打赏
  • 举报
回复
    void push(Data const& data)  
    {  
        {
             boost::mutex::scoped_lock lock(the_mutex);  
             the_queue.push(data);  
        }
        the_condition_variable.notify_one();  
    }  
该这么写吧
zhouzhipen 2013-11-06
  • 打赏
  • 举报
回复
希望有用过condition_variable的朋友解答一下!
zhouzhipen 2013-11-05
  • 打赏
  • 举报
回复
引用 2 楼 xuddk727 的回复:
似乎没看见你delete操作
队列本身没有new 任何对象所以不需要delete,而且遇到的问题也不是内存泄露,而是句柄泄露。
引用 3 楼 yaozhiyong110 的回复:
怎么你的只有push里lock和unlock是成对出现 其他函数都只lock了?
boost::mutex::scoped_lock作用域锁,在构造时自动对互斥体加锁,析构时自动解锁,如果作用域中手动解锁,析构时跳过。
yaozhiyong110 2013-11-05
  • 打赏
  • 举报
回复
怎么你的只有push里lock和unlock是成对出现 其他函数都只lock了?
许文君 2013-11-05
  • 打赏
  • 举报
回复
似乎没看见你delete操作
zhouzhipen 2013-11-05
  • 打赏
  • 举报
回复
高手可在?????
穿跑鞋不跑步 2013-11-05
  • 打赏
  • 举报
回复
不明觉历
modyaj 2013-11-05
  • 打赏
  • 举报
回复
硬是看不出问题,换其他类型的锁看看!
内容概要:本文档详细介绍了基于Cplex解器的风光制氢合成氨系统优化研究,通过Matlab代码实现对这一复杂可再生能源系统的建模与优化分析。研究聚焦于风能、光伏等可再生能源耦合电解水制氢并进一步合成氨的综合能源系统,重点解决系统在容量配置与运行调度方面的协同优化问题。采用Cplex解器进行高效的混合整数线性规划(MILP)解,实现了对系统经济性、能效性、环境可持续性的多目标优化,涵盖设备选型与容量设计、能量流分配、运行策略制定、制氢与合成氨工艺集成等关键技术环节。该研究为高比例可再生能源消纳、绿氢规模化生产及绿色化工转型提供了重要的理论依据与可行的技术路径。; 适合人群:具备电力系统、能源系统、运筹学或化工过程系统工程等相关背景,熟悉Matlab编程与数学建模方法,从事新能源、氢能、综合能源系统、绿色化工等领域研究的研究生、科研人员及工程技术人员。; 使用场景及目标:① 学习并复现高水平学术论文中关于风光制氢合成氨系统的优化模型构建方法;② 掌握利用Cplex解器解决复杂能源系统混合整数线性规划(MILP)问题的核心技术与实践流程;③ 为自身的科研项目或工程应用提供系统建模、优化算法实现与代码参考的坚实基础。; 阅读建议:学习者应结合所提供的Matlab代码与相关参考文献,深入剖析模型的物理意义、数学推导过程、约束条件的设定逻辑以及目标函数的设计思路,特别关注Cplex与Matlab的接口调用与数据传递机制,并建议通过调整关键参数(如可再生能源出力、设备效率、成本系数等)进行敏感性分析,以全面理解系统优化的内在机理与决策影响。

16,550

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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