首页 > 其他分享 >boost::this_thread::sleep_for()死锁

boost::this_thread::sleep_for()死锁

时间:2023-06-15 23:04:00浏览次数:37  
标签:thread 死锁 sleep boost milliseconds wait


boost::this_thread::sleep_for()会死锁

(金庆的专栏)


发现睡眠1ms很容易死锁。


boost::this_thread::sleep_for(boost::chrono::milliseconds(1)). 


Boost 1.54.0




以下代码很可能重现死锁:



#include "stdafx.h"

#include <iostream>
#include <boost/thread.hpp>

using namespace std;

void worker()
{
    for (int i = 0; i < 10000; i++)
        boost::this_thread::sleep_for(boost::chrono::milliseconds(1));
}

int _tmain(int argc, _TCHAR* argv[])
{
    boost::thread_group tg;
    for (int i = 0; i < 30; i++)
        tg.create_thread(worker);

    tg.join_all();
    cout << "All done!" << endl;
    return 0;
}



附加到死锁进程调试时,调用栈如下:


boost::this_thread::interruptible_wait() Line 547 

boost::detail::basic_cv_list_entry::wait() Line 94 

boost::detail::basic_condition_variable::do_wait<>() Line 228 

boost::condition_variable::wait_until<>() Line 371 

boost::this_thread::sleep_until<>() Line32 

boost::this_thread::sleep_for<>() Line72 

worker() 

boost::detail::thread_data<>()


程序在停在thread.cpp:547:


unsigned long const notified_index=detail::win32::WaitForMultipleObjects(handle_count, handles, false, using_timer?INFINITE:time_left.milliseconds);

其中    


handle_count = 2 

using_timer = false 

time_left.milliseconds = 0xfffffffe




发现 basic_cv_list_entry::wait(timeout abs_time) 当 abs_time.milliseconds = uint64(-1) 时就会死锁.


所在可以在此断点,将 abs_time.milliseconds 改为 uint64(-1),就可以重现死锁了.



实际上该参数很可能输入为-1:


    


wait_until(...)
        {
          do_wait(lock, ceil<milliseconds>(t-Clock::now()).count());
          ...
        }

这几天改服务器代码,添加了许多 sleep_for(), 结果就经常发现服务器停止响应了。


幸好该错误仅在Windows上存在。错误位于 boost/thread/win32/condition_variable.hpp.



正准备给Boost添加条Bug记录,发现该错误已在3周前报告,10天前已修正,将在1.55.0版本中发布。


见:


Condition variable will wait forever for some timepoint values (MSVC)    


https://svn.boost.org/trac/boost/ticket/9079

修正代码如下:


chrono::time_point<Clock, Duration> now = Clock::now(); 
    if (t<=now) { 
      return cv_status::timeout; 
    } 
    do_wait(lock, ceil<milliseconds>(t-now).count());

   


标签:thread,死锁,sleep,boost,milliseconds,wait
From: https://blog.51cto.com/u_16162321/6495496

相关文章

  • MinGw编译Boost
    MinGw编译Boost(金庆的专栏)在MinGwShell中运行bootstrap.sh失败Jinq@jinqing-pc/d/src/boost_1_52_0$bootstrap.shtoolset=gccBuildingBoost.Buildenginewithtoolsetgcc...FailedtobuildBoost.BuildbuildengineConsult'bootstrap.log......
  • 用boost::bind构造boost::coroutine
    classTestCoro{...typedefboost::coroutines::coroutione<void()>Coro; voidCoroFun(Coro::caller_type&ca);Corom_coro;};TestCoro::TestCoro(){m_coro=Coro(boost::bind(&TestCoro::CoroFun,this,_1));}可......
  • XGBoost超参数调优指南
    本文将详细解释XGBoost中十个最常用超参数的介绍,功能和值范围,及如何使用Optuna进行超参数调优。对于XGBoost来说,默认的超参数是可以正常运行的,但是如果你想获得最佳的效果,那么就需要自行调整一些超参数来匹配你的数据,以下参数对于XGBoost非常重要:etanum_boost_roundmax_dep......
  • sqlserver 数据库死锁 解决心得
    背景:一个客服数据库,每天不定时死锁,死锁时间很短。等到远程时死锁已经结束。起初遇到死锁,一般都是先通过活动监视器,找到头阻塞的id,通过spid定位到机器和程序。但是这次情况比较特殊,每次死锁时间较短,不好追踪。最后想来想去还是锁的概念掌握的不够清晰,在网上又找了几篇文章......
  • boost库之字符串处理
    一、Boost.StringAlgorithmsBoost字符算法库Boost.StringAlgorithms提供了很多字符串操作函数,字符串的类型可以是std::string,std::wstring,或者是任何模板类std::basic_string的实例。这些函数分类别在不同的头文件定义,例如大小写转函数定义在文件boost/algorithm/string/case_c......
  • boost库之事件处理
    一、概述Boost.Signals所实现的模式被命名为"信号至插槽",它基于以下概念:当对应的信号被发出时,相关联的插槽即被执行,原则上,可以把"信号"和"插槽"分别替换为'事件'和'事件处理器',它提供了一个名为boost::signal的类,定义于boost/signal.hpp,实际上,这个头文件是唯一一个需要知道的,因......
  • [ABC305D] Sleep Log题解
    题目大意给\(N\)个时刻:当\(i\)为奇数时,\(A_i\)表示刚刚起床的时刻。当\(i\)为偶数时,\(A_i\)表示开始睡觉的时刻。有\(Q\)次询问,每次求在\([l,r]\)区间内睡了多长时间。分析首先我们要考虑处理边界情况。每一次二分查找第一个大于等于\(l\)和\(r\)的时刻......
  • 死锁
    死锁为什么会产生死锁?只有理解了死锁为什么会产生,才能理解死锁产生需要的条件,同样死锁是一种现象,而不是一种机制.死锁的出现其实是由于同步原语也就是各种同步机制所带来的,不可能做到百分百避免当有多个线程为了有限的资源竞争时,有的线程就会因为某一时刻没有空闲的......
  • Boost::asio范例分析 服务端
      main函数要求程序调用者传递3个参数:服务器IP地址,端口号和文档根目录.其中IP地址可以是IPv4或IPv6格式.接着创建server对象实例,将传递进来的IP地址,端口号,文档根目录作为server对象的构造函数参数传递到处理程序中.最后调用server的run成员函数启动服务端处理例程.   ......
  • MySQL数据库死锁问题
    参看:https://www.bilibili.com/video/BV1RT4y1R7bL/?spm_id_from=333.337.search-card.all.click&vd_source=46d50b5d646b50dcb2a208d3946b1598https://www.bilibili.com/video/BV1Sm4y1C7WX/?spm_id_from=333.337.search-card.all.click&vd_source=46d50b5d646b50dcb......