boost::detail::spinlock 第一次lock就死锁,是不是bug

dosmlp 2018-03-16 05:54:45
boost::detail::spinlock 第一次lock就死锁
伪代码
class device
public:
void read()
{
m_spin_lock.lock();
m_spin_lock.unlock();
}
void write()
{
m_spin_lock.lock();
m_spin_lock.unlock();
}
private:
boost::detail::spinlock m_spin_lock;

如上所示,我有这样一个类,但是不管read先进去还是write先进去,lock都会死在那里,下面的执行不下去了,
然后我在构造函数里m_spin_lock.unlock一下就没这个问题
你们有这个问题吗?
windows 10 boost 1.65.1 vs2013
...全文
847 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
Mr.LuoJ 2019-04-04
  • 打赏
  • 举报
回复
把v_ = 0; 需要给个初值
monolithAR 2018-03-21
  • 打赏
  • 举报
回复
这个可能跟版本有关,我的boost版本1.57,spinlock没有默认构造函数,导致调用lock会死循环
class spinlock { public: long v_; public: bool try_lock() { long r = BOOST_SP_INTERLOCKED_EXCHANGE( &v_, 1 ); BOOST_COMPILER_FENCE return r == 0; } void lock() { for( unsigned k = 0; !try_lock(); ++k ) { boost::detail::yield( k ); } } void unlock() { BOOST_COMPILER_FENCE *const_cast< long volatile* >( &v_ ) = 0; } public: class scoped_lock { private: spinlock & sp_; scoped_lock( scoped_lock const & ); scoped_lock & operator=( scoped_lock const & ); public: explicit scoped_lock( spinlock & sp ): sp_( sp ) { sp.lock(); } ~scoped_lock() { sp_.unlock(); } }; }; } // namespace detail } // namespace boost 新的spinlock有构造函数,构造函数里有unlock调用,所以不会死。跟版本有关系,换个新的版本应该就好了
dosmlp 2018-03-20
  • 打赏
  • 举报
回复
引用 7 楼 mstlq 的回复:
换了个1.65.1,win10+vs2013,结果同6楼…… 无法复现楼主的问题
那就很奇怪了 我这里不管1.65.1还是1.66.0 还是vs2013或2015都可以100%复现 办公室笔记本和家里台式机都100%复现
mstlq 2018-03-19
  • 打赏
  • 举报
回复
引用 3 楼 dosmlp 的回复:
release版本无法输出"lock"
那么神奇? 明晚有时间的话,我也试试看。。。
mstlq 2018-03-19
  • 打赏
  • 举报
回复
换了个1.65.1,win10+vs2013,结果同6楼…… 无法复现楼主的问题
mstlq 2018-03-19
  • 打赏
  • 举报
回复

boost 1.66 + vs2013 release版本一切正常
楼主的具体构建环境是?
dosmlp 2018-03-17
  • 打赏
  • 举报
回复
引用 2 楼 mstlq 的回复:
[quote=引用 1 楼 paschen 的回复:] 可能对象构造后就默认是锁的状态,没研究boost,这只是我一个猜测,具体你看spinlock相关文档说明
http://www.boost.org/doc/libs/1_54_0/doc/html/atomic/usage_examples.html#boost_atomic.usage_examples.example_spinlock 按文档说,构造后默认是非锁状态。。。 还是请楼主发一下代码吧(1.确认能重现问题,2.去除其余无关部分,尽量只保留spinlock相关操作),没有代码不好猜测[/quote]
#include <boost/smart_ptr/detail/spinlock.hpp>
#include <iostream>

int main(int argc, char* argv[])
{
	boost::detail::spinlock spin_lock;
	spin_lock.lock();
	std::cout << "lock" << std::endl;
	system("pause");
	return 0;
}
release版本无法输出"lock"
mstlq 2018-03-16
  • 打赏
  • 举报
回复
引用 1 楼 paschen 的回复:
可能对象构造后就默认是锁的状态,没研究boost,这只是我一个猜测,具体你看spinlock相关文档说明
http://www.boost.org/doc/libs/1_54_0/doc/html/atomic/usage_examples.html#boost_atomic.usage_examples.example_spinlock 按文档说,构造后默认是非锁状态。。。 还是请楼主发一下代码吧(1.确认能重现问题,2.去除其余无关部分,尽量只保留spinlock相关操作),没有代码不好猜测
paschen 版主 2018-03-16
  • 打赏
  • 举报
回复
可能对象构造后就默认是锁的状态,没研究boost,这只是我一个猜测,具体你看spinlock相关文档说明
#### 收益: 学习《optee系统开发精讲 》套餐的收益如下:1、全体系的掌握optee的核心知识点(多核多线程、启动流程、各类API、TA/PTA/STA、driver、service、各类设计思想、内存管理、中断管理...);2、掌握TEE OS的设计核心思想(不限与optee,对其它TEE也是如此),能够进入软件架构层次的各项设计;3、快速熟悉大系统软件的各项组件,能够进行大系统软件之间的设计或排查问题4、学习和理解理解Armv8/Armv9架构、Trustzone架构5、技术水平提升N个level, 掌握快速的学习方法;#### 课程简介和大纲 该课程包含但不限与以下章节:optee的组件介绍optee os启动流程optee os的初始化流程optee os线程向量表及其作用进入optee os的八种方式optee os的异常向量表和设计模型optee os对irq中断的处理optee os对fiq中断的处理optee os的内存管理optee os的MMU的使用optee os的根密钥(信任根)optee os的RPC机制optee os的存储系统optee os的SFS系统optee os的RPMB机制的实现optee os的Timer实现optee os中实现的GP APIoptee os中的系统调度optee os中密码学函数的支持optee os中的线程调度CA/TA的开发模型optee os中的serviceoptee os中的 PTAoptee os中的 secure driveroptee os中的 Early TAoptee中spinlock的实现原理详解optee中mutex的实现方式optee的栈指针和栈内存的介绍optee中使用虚函数(平台客制化)的设计模型共享内存的介绍optee os的标准错误码TA的签名和验签TA链接静态库的方法

64,682

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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