boost的try_lock概念的思考

caddor2011 2014-05-20 03:24:51

boost的try_lock概念的思考



boost中有个try_lock的概念, 在官方文档里看到。 于是到处搜索windows下try_lcok的实现。


发现一博客里提到:

http://blog.csdn.net/weiwangchao_/article/details/7938892

是用waitforsingleobject(句柄, 0)来实现的。

看完之后,失望之极, 不就换个参数而已,搞这种噱头。 失望原因:try_lock 的意义是什么》

waitforsingleobject是不会消耗cpu的, 这种所谓的try_lock的优势在哪里?或者应用场景在哪里?

这是我的第一个问题。

第2个问题:
从1.32版本文档里看到的:
http://www.boost.org/doc/libs/1_32_0/doc/html/threads/concepts.html#threads.concepts.ScopedTryLock

TryLock Concept

A TryLock is a refinement of Lock. For a TryLock type L and an object lk of that type, the following expressions must be well-formed and

have the indicated effects.

Table 10.7. TryLock Expressions

Expression Effects
lk.try_lock()
Throws boost::lock_error if locked().

Makes a non-blocking attempt to lock the associated mutex object, returning true if the lock attempt is successful, otherwise false.
If the associated mutex object is already locked
by the same thread the behavior is dependent on the locking strategy of the associated mutex object.


1.32中有这么几个锁的策略(http://www.boost.org/doc/libs/1_32_0/doc/html/threads/concepts.html#threads.concepts.locking-strategies)

Locking Strategies

Recursive Locking Strategy
Checked Locking Strategy
Unchecked Locking Strategy
Unspecified Locking Strategy

我的第二个问题是:

一般的boost::mutex::lock , boost::mutext::unlock是属于哪一种锁的策略? 是属于

Unspecified Locking Strategy吗 ?


...全文
517 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
就想叫yoko 2014-05-28
  • 打赏
  • 举报
回复
说白了,就是减少锁等待、阻塞的可能 现在高性能点的东西,都是这个思路,榨干CPU 其他的5楼都说的很清楚了
caddor2011 2014-05-28
  • 打赏
  • 举报
回复
caddor2011 2014-05-22
  • 打赏
  • 举报
回复
引用 8 楼 daiweifeng 的回复:
非常有用! 做一个监听线程要这么写: ... mutex mtx; ... while(1) { if(mtx.try_lock()) { printf(...); // do something }else { printf(...); // do other thing sleep(); } }
请说出提到的 something other things 分别是什么东西,我想看看到底是什么业务,什么需求会要求这么写? 谢谢
超级能量泡泡 2014-05-21
  • 打赏
  • 举报
回复
非常有用! 做一个监听线程要这么写: ... mutex mtx; ... while(1) { if(mtx.try_lock()) { printf(...); // do something }else { printf(...); // do other thing sleep(); } }
hlyces 2014-05-21
  • 打赏
  • 举报
回复
boost是跨平台的。。。所以它的try_lock在windows和linux下的实现是不一样的。 另外是非阻塞的,这就是它的用处了。
caddor2011 2014-05-21
  • 打赏
  • 举报
回复
引用 5 楼 menzi11 的回复:
[quote=引用 4 楼 bsnry 的回复:] [quote=引用 3 楼 menzi11 的回复:] 没研究过boost里面的thread,不过从字面来看,无非就是try_lock嘛... try_lock很有用,再怎么厉害的lock,最后都无非就是等待罢了,try lock 提供给人一个若返回false时候的选择,例如如果碰见返回false的情况,我可以选择 让当前这个线程干点别的而不是在那里傻等.
没见过实际项目中这么使用[/quote] 前几天csdn刚登个java的新闻,说是java内核实现了比一般的原子计数器更快的计数器,就是用的 类似的try_lock的思想,假如有个全局计数器X,计数器的位数很大不能保证加法的原子性,那么 假如同时有10个线程ABCDEFGHIJ.需要对X进行"++",正常情况用锁,慢到死,但是使用try lock的思想,我可以每个线程持有 一个X同类型的本地变量abcdefghij,假如线程A需要操作全局X,但发现try lock失败,那么线程A不等待而是直接让当前线程本地的变量a"++",等到下次需要对X修改同时又try lock成功的时候令X+=a.这就导致10条线程之间完全无锁又可同时修改一个变量.这就是try lock可带来的性能提升. 实际项目用不用得看实际项目是什么,别提try lock用不用了,我这都写lockfree快两年了......[/quote] 这个例子 想的太是不错 可惜,实际应用中我实在遇不到。
menzi11 2014-05-20
  • 打赏
  • 举报
回复
引用 4 楼 bsnry 的回复:
[quote=引用 3 楼 menzi11 的回复:] 没研究过boost里面的thread,不过从字面来看,无非就是try_lock嘛... try_lock很有用,再怎么厉害的lock,最后都无非就是等待罢了,try lock 提供给人一个若返回false时候的选择,例如如果碰见返回false的情况,我可以选择 让当前这个线程干点别的而不是在那里傻等.
没见过实际项目中这么使用[/quote] 前几天csdn刚登个java的新闻,说是java内核实现了比一般的原子计数器更快的计数器,就是用的 类似的try_lock的思想,假如有个全局计数器X,计数器的位数很大不能保证加法的原子性,那么 假如同时有10个线程ABCDEFGHIJ.需要对X进行"++",正常情况用锁,慢到死,但是使用try lock的思想,我可以每个线程持有 一个X同类型的本地变量abcdefghij,假如线程A需要操作全局X,但发现try lock失败,那么线程A不等待而是直接让当前线程本地的变量a"++",等到下次需要对X修改同时又try lock成功的时候令X+=a.这就导致10条线程之间完全无锁又可同时修改一个变量.这就是try lock可带来的性能提升. 实际项目用不用得看实际项目是什么,别提try lock用不用了,我这都写lockfree快两年了......
bsnry 2014-05-20
  • 打赏
  • 举报
回复
引用 3 楼 menzi11 的回复:
没研究过boost里面的thread,不过从字面来看,无非就是try_lock嘛... try_lock很有用,再怎么厉害的lock,最后都无非就是等待罢了,try lock 提供给人一个若返回false时候的选择,例如如果碰见返回false的情况,我可以选择 让当前这个线程干点别的而不是在那里傻等.
没见过实际项目中这么使用
menzi11 2014-05-20
  • 打赏
  • 举报
回复
没研究过boost里面的thread,不过从字面来看,无非就是try_lock嘛... try_lock很有用,再怎么厉害的lock,最后都无非就是等待罢了,try lock 提供给人一个若返回false时候的选择,例如如果碰见返回false的情况,我可以选择 让当前这个线程干点别的而不是在那里傻等.
bsnry 2014-05-20
  • 打赏
  • 举报
回复
1. 应用场景没见过,try_lock 会立即返回吧。
赵4老师 2014-05-20
  • 打赏
  • 举报
回复
boost<windows

65,208

社区成员

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

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