多线程锁的效率

星爷是我哥 2014-05-29 11:31:22
最近使用多线程加锁,发现有时会互相等待,有点费时,于是我用while死循环加sleep去当锁。。

我就想,加锁是不是类似中断,CPU保存运行环境,得到锁时再加入来运行,而我用while加sleep,是一直在运行sleep是睡眠线程,,

这两种方式哪种的效率要高一些呢。。

若有什么理解错误,请大家指出。。。
...全文
391 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
mujiok2003 2014-05-29
  • 打赏
  • 举报
回复
1. 线程上下切换代价很高, 尽量减少。 可以使用条件变量+ 互斥量实现:条件不满足是, 让出CPU; 在条件满足时唤醒。 2. 锁的底层是CPU指令,和内存模型相关, 不同CPU指令不同。 和中断不是一回事。
  • 打赏
  • 举报
回复
如果这样可以替代锁的话,windows为什么还要费时费力的去实现各种锁呢? 真正的锁是触发式的,条件一满足,会立刻调度线程。而使用Sleep,无论粒度有多小,总是会有延迟的。Sleep频度越快,越占用cpu;sleep频度越低,越不精确。 内核有益中锁是自旋锁,大致上是这么个原理。但那时用来在多个cpu之间同步,而且要求等待的时间要很短才可以。
mujiok2003 2014-05-29
  • 打赏
  • 举报
回复
引用
于是我用while死循环加sleep去当锁。
千万不要这么做, 不可能替换锁。
ningto.com 2014-05-29
  • 打赏
  • 举报
回复
sleep一般使用在调试环境中
不要做咸鱼 2014-05-29
  • 打赏
  • 举报
回复
sleep是不会使用CPU的,当sleep时间过后他会自动排队去等待CPU 没有看过互斥锁的源码,但是效率上应该差不多吧
赵4老师 2014-05-29
  • 打赏
  • 举报
回复
无profiler不要谈效率!!尤其在这个云计算、虚拟机、模拟器、CUDA、多核 、多级cache、指令流水线、多种存储介质、……满天飞的时代!
sdghchj 2014-05-29
  • 打赏
  • 举报
回复
一样的,sleep的时间里,cpu可以去执行其它线程或进程。
星爷是我哥 2014-05-29
  • 打赏
  • 举报
回复
谢谢大家,,总结为:不要干系统干了的事,微软比我牛X了N倍。。
zilaishuichina 2014-05-29
  • 打赏
  • 举报
回复
使用锁 绝对比你 sleep好 一般windows下 常用的CRITICAL_SECTION,mutex 如果lz觉得锁的等待时间太长,1可以缩小锁住的代码段的范围,2可以使用TryEnterCriticalSection,该函数不阻塞

64,682

社区成员

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

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