2025年c++ 条件变量和读写锁(c++11 条件变量wait函数)

c++ 条件变量和读写锁(c++11 条件变量wait函数)if m db cur conn cnt gt m db max conn cnt span style color rgba 0 128 0 1 span span style color rgba 0 128 0 1 span

大家好,我是讯享网,很高兴认识大家。



if (m_db_cur_conn_cnt >= m_db_max_conn_cnt)

讯享网

讯享网 { </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 如果已经到达了,看看是否需要超时等待</span> <span style="color: rgba(0, 0, 255, 1)">if</span>(timeout_ms &lt;= <span style="color: rgba(128, 0, 128, 1)">0</span>) <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 死等,直到有连接可以用 或者 连接池要退出</span> 

{

 log_info(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">wait ms:%d 

, timeout_ms);


讯享网

讯享网 m_cond_var.wait(</span><span style="color: rgba(0, 0, 255, 1)">lock</span>, [<span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">] { </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> log_info("wait:%d, size:%d 

”, wait_cout++, m_free_list.size());

 </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 当前连接数量小于最大连接数量 或者请求释放连接池时退出</span> <span style="color: rgba(0, 0, 255, 1)">return</span> (!m_free_list.empty()) |<span style="color: rgba(0, 0, 0, 1)"> m_abort_request; }); } </span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)"> { </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> return如果返回 false,继续wait(或者超时), 如果返回true退出wait </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 1.m_free_list不为空 </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 2.超时退出 </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 3. m_abort_request被置为true,要释放整个连接池</span> m_cond_var.wait_for(<span style="color: rgba(0, 0, 255, 1)">lock</span>, std::chrono::milliseconds(timeout_ms), [<span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">] { </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> log_info("wait_for:%d, size:%d 

”, wait_cout++, m_free_list.size());

讯享网 <span style="color: rgba(0, 0, 255, 1)">return</span> (!m_free_list.empty()) |<span style="color: rgba(0, 0, 0, 1)"> m_abort_request; }); </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 带超时功能时还要判断是否为空</span> <span style="color: rgba(0, 0, 255, 1)">if</span>(m_free_list.empty()) <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 如果连接池还是没有空闲则退出</span> 

{

 </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> NULL; } } </span><span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)">(m_abort_request) { log_warn(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">have aboort 

);

讯享网 </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> NULL; } } </span><span style="color: rgba(0, 0, 255, 1)">else</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 还没有到最大连接则创建连接</span> 

{

 CDBConn </span>*pDBConn = <span style="color: rgba(0, 0, 255, 1)">new</span> CDBConn(<span style="color: rgba(0, 0, 255, 1)">this</span>); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">新建连接</span> <span style="color: rgba(0, 0, 255, 1)">int</span> ret = pDBConn-&gt;<span style="color: rgba(0, 0, 0, 1)">Init(); </span><span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> (ret) { log_error(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Init DBConnecton failed 

);

讯享网 </span><span style="color: rgba(0, 0, 255, 1)">delete</span><span style="color: rgba(0, 0, 0, 1)"> pDBConn; </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> NULL; } </span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)"> { m_free_list.push_back(pDBConn); m_db_cur_conn_cnt</span>++<span style="color: rgba(0, 0, 0, 1)">; </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> log_info("new db connection: %s, conn_cnt: %d 

”, m_pool_name.c_str(), m_db_cur_conn_cnt); }

 }</span></pre> 

小讯
上一篇 2025-06-07 15:54
下一篇 2025-06-09 16:20

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/187505.html