boost asio计时器是否会在"取消"时阻塞
Is boost asio timer expected to block on `cancel`?
当调用cancel
并且async_wait
提供的回调已经在执行时,我观察到boost::asio::steady_timer
正在阻塞。这是预期行为吗?它是可配置的吗?为什么一开始就必须封锁?
调用堆栈:
#0 __lll_lock_wait () at ../sysdeps/unix/sysv/linux/x86_64/lowlevellock.S:135
#1 0x00007f4d4c703dbd in __GI___pthread_mutex_lock (mutex=0x20000616f558) at ../nptl/pthread_mutex_lock.c:80
#2 0x000070000086ef75 in boost::asio::detail::posix_mutex::lock (this=0x20000616f558) at /source/boost/include/boost/asio/detail/posix_mutex.hpp:52
#3 0x000070000087036e in boost::asio::detail::conditionally_enabled_mutex::scoped_lock::scoped_lock (this=0x40000623e970, m=...) at /source/boost/include/boost/asio/detail/conditionally_enabled_mutex.hpp:55
#4 0x00007000009ebf7f in boost::asio::detail::epoll_reactor::cancel_timer<boost::asio::detail::chrono_time_traits<std::chrono::_V2::steady_clock, boost::asio::wait_traits<std::chrono::_V2::steady_clock> > > (this=0x20000616f520, queue=..., timer=...,
max_cancelled=18446744073709551615) at /source/boost/include/boost/asio/detail/impl/epoll_reactor.hpp:62
#5 0x00007000009e8322 in boost::asio::detail::deadline_timer_service<boost::asio::detail::chrono_time_traits<std::chrono::_V2::steady_clock, boost::asio::wait_traits<std::chrono::_V2::steady_clock> > >::cancel (this=0x200006188f60, impl=..., ec=...)
at /source/boost/include/boost/asio/detail/deadline_timer_service.hpp:144
#6 0x00007000009e5211 in boost::asio::basic_waitable_timer<std::chrono::_V2::steady_clock, boost::asio::wait_traits<std::chrono::_V2::steady_clock> >::cancel (this=0x20009470cfc8)
at /source/boost/include/boost/asio/basic_waitable_timer.hpp:329
看起来问题是由于我们在多进程环境中工作。所有进程共享相同的内存,在该共享内存上创建的所有对象,包括互斥体、线程等。为了在这种情况下正常工作,系统中使用的互斥体都是用PTHREAD_PROCESS_SHARED
属性创建的。显然,asio
互斥体并不是用这样的属性创建的,所以我想这就是互斥体被卡在意外位置的问题所在。一旦io_context
和steady_timer
仅在一个进程中开始执行,它就开始按预期工作
相关文章:
- 挂起和取消挂起一个文件DLL
- 如何取消对nullptr的屏蔽,返回正确的对象
- C++取消引用指针.为什么会发生变化
- 使用取消引用的指针的多态性会产生意外的结果.为什么?
- 取消引用运算符不能重载
- 在他自己的方法中,有可能将一个对象取消引用到另一个对象吗
- 如何在Qt中取消捕获字符串
- 如何使用 TStyleManager::UnRegisterStyle() 取消注册样式
- GLEW/GLUT:调用init并创建一个窗口后,取消初始化并重新初始化?
- C++ 关于指针取消引用的技术问题
- 没有取消引用/解包对象的标准方法?
- 列表 iter 不取消引用 使用列表进行插入排序
- C++宏定义和取消定义
- 在这个函数中是有缺陷的,因为取消引用 null 是无效的,所以我想更改代码
- 取消引用结束指针到数组类型的一个
- 取消引用向量时出现问题
- 提升 asio 并发计时器取消问题与链
- 取消引用指向整数的指针时获得不同的结果
- tbb::p arallel_for_each 在取消时未执行
- 在清除 istream 之前,我不应该需要取消获取它吗?