关于无锁编程的疑问

kingstarer 2013-11-03 08:38:24
http://www.ibm.com/developerworks/cn/linux/l-cn-lockfree/

这里介绍了cas原语

但我不知道是怎么确保这个cas原语的正常性

很有可能两个线程同时并发,同时进行cas

同时通过if判断

这个时候不就出问题了?
...全文
379 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
nadleeh 2014-04-02
  • 打赏
  • 举报
回复
引用 15 楼 nadleeh123 的回复:
[quote=引用 楼主 kingstarer 的回复:] http://www.ibm.com/developerworks/cn/linux/l-cn-lockfree/ 这里介绍了cas原语 但我不知道是怎么确保这个cas原语的正常性 很有可能两个线程同时并发,同时进行cas 同时通过if判断 这个时候不就出问题了?
多核才有真正的并发,单核只需处理好抢占的问题![/quote] 也不太对,嵌入式cpu也有带超线程技术的。准确说是物理上单线程只考虑禁抢占,物理上多线程就要考虑并发了
nadleeh 2014-04-02
  • 打赏
  • 举报
回复
引用 楼主 kingstarer 的回复:
http://www.ibm.com/developerworks/cn/linux/l-cn-lockfree/ 这里介绍了cas原语 但我不知道是怎么确保这个cas原语的正常性 很有可能两个线程同时并发,同时进行cas 同时通过if判断 这个时候不就出问题了?
多核才有真正的并发,单核只需处理好抢占的问题!
kingstarer 2014-04-01
  • 打赏
  • 举报
回复
感谢各位回答,转行结贴
lm_whales 2013-11-07
  • 打赏
  • 举报
回复
这种锁,比系统提供的锁要快得多, 不需要在用户模式和系统模式之间切换。 缺点是需要忙查询。 不能挂起线程比较长的时间。 适合持续不间断计算的场合。
lm_whales 2013-11-05
  • 打赏
  • 举报
回复
1)lock 2)cmpxchg8b
mujiok2003 2013-11-04
  • 打赏
  • 举报
回复
引用 5 楼 kingstarer 的回复:
[quote=引用 2 楼 DelphiGuy 的回复:] 这依赖处理器的原子操作指令,比如x86/x64中的lock cmpxchg/cmpxchg8b/cmpxchg16b,可以实现读、比较、修改的原子化,此一系列操作中间不会被中断,而且此时内存总线被锁定,其他处理器/核心不能访问内存/cache。
没看见这里调用汇编啊 另外,这样的话不是也出现锁了吗(硬件级的锁)[/quote] CPU提供原子操作指令。 锁一般由操作系统提供,比如mutex, critical section待,一般是在原子操作的基础上实现的。
mujiok2003 2013-11-04
  • 打赏
  • 举报
回复
引用 4 楼 kingstarer 的回复:
[quote=引用 1 楼 mujiok2003 的回复:]
引用
根据此理论,业界在原子操作的基础上提出了著名的 CAS(Compare - And - Swap)操作来实现 Lock-Free 算法,Intel 实现了一条类似该操作的指令:cmpxchg8。
由硬件来/CPU保证
但是这里 是用代码实现啊 没见他用汇编指令(c翻译成汇编会加多很多语句) 也没见关中断[/quote]

  //InterlockedCompareExchange是windows 的一原子操作API
  9000: unsigned __int64
  9001: InterlockedCompareExchange(
  9002:     _Inout_ _Interlocked_operand_ unsigned __int64 volatile *Destination,
  9003:     _In_ unsigned __int64 Exchange,
  9004:     _In_ unsigned __int64 Comperand
  9005:     )
  9006: {
001713C0 55                   push        ebp  
001713C1 8B EC                mov         ebp,esp  
001713C3 81 EC C0 00 00 00    sub         esp,0C0h  
001713C9 53                   push        ebx  
001713CA 56                   push        esi  
001713CB 57                   push        edi  
001713CC 8D BD 40 FF FF FF    lea         edi,[ebp-0C0h]  
001713D2 B9 30 00 00 00       mov         ecx,30h  
001713D7 B8 CC CC CC CC       mov         eax,0CCCCCCCCh  
001713DC F3 AB                rep stos    dword ptr es:[edi]  
  9007:     return (unsigned __int64) _InterlockedCompareExchange64((volatile long long*) Destination, (long long) Exchange, (long long) Comperand);
001713DE 8B 45 14             mov         eax,dword ptr [Comperand]  
001713E1 8B 55 18             mov         edx,dword ptr [ebp+18h]  
001713E4 8B 75 08             mov         esi,dword ptr [Destination]  
001713E7 8B 4D 10             mov         ecx,dword ptr [ebp+10h]  
001713EA 8B 5D 0C             mov         ebx,dword ptr [Exchange]  
001713ED F0 0F C7 0E          lock cmpxchg8b qword ptr [esi]  //cmpxchg8b就是由CPU提供的指令
  9008: }
秃头披风侠 2013-11-04
  • 打赏
  • 举报
回复
一些CPU提供的指令集包含无锁操作.就像楼上某位说的, 其实也是"锁", 不过这种锁是由硬件保证的.
qq120848369 2013-11-04
  • 打赏
  • 举报
回复
有些无锁实际有锁,还是得看操作系统提供了什么接口。
lunat 2013-11-03
  • 打赏
  • 举报
回复
参考c++11 stdatomic http://en.cppreference.com/w/c/atomic boost lockfree库: http://www.boost.org/doc/libs/1_54_0/doc/html/lockfree.html
  • 打赏
  • 举报
回复
应该在Bool CAS(T* addr, T expected, T newValue) 的内部吧。 无锁应该是无操作系统级的锁操作,lock cmpxchg指令的性能是很好的。
kingstarer 2013-11-03
  • 打赏
  • 举报
回复
引用 2 楼 DelphiGuy 的回复:
这依赖处理器的原子操作指令,比如x86/x64中的lock cmpxchg/cmpxchg8b/cmpxchg16b,可以实现读、比较、修改的原子化,此一系列操作中间不会被中断,而且此时内存总线被锁定,其他处理器/核心不能访问内存/cache。
没看见这里调用汇编啊 另外,这样的话不是也出现锁了吗(硬件级的锁)
kingstarer 2013-11-03
  • 打赏
  • 举报
回复
引用 1 楼 mujiok2003 的回复:
引用
根据此理论,业界在原子操作的基础上提出了著名的 CAS(Compare - And - Swap)操作来实现 Lock-Free 算法,Intel 实现了一条类似该操作的指令:cmpxchg8。
由硬件来/CPU保证
但是这里 是用代码实现啊 没见他用汇编指令(c翻译成汇编会加多很多语句) 也没见关中断
jiandingzhe 2013-11-03
  • 打赏
  • 举报
回复
引用 2 楼 DelphiGuy 的回复:
这依赖处理器的原子操作指令,比如x86/x64中的lock cmpxchg/cmpxchg8b/cmpxchg16b,可以实现读、比较、修改的原子化,此一系列操作中间不会被中断,而且此时内存总线被锁定,其他处理器/核心不能访问内存/cache。
那不就一样是锁啊?只是不叫“锁”而已。
  • 打赏
  • 举报
回复
这依赖处理器的原子操作指令,比如x86/x64中的lock cmpxchg/cmpxchg8b/cmpxchg16b,可以实现读、比较、修改的原子化,此一系列操作中间不会被中断,而且此时内存总线被锁定,其他处理器/核心不能访问内存/cache。
mujiok2003 2013-11-03
  • 打赏
  • 举报
回复
引用
根据此理论,业界在原子操作的基础上提出了著名的 CAS(Compare - And - Swap)操作来实现 Lock-Free 算法,Intel 实现了一条类似该操作的指令:cmpxchg8。
由硬件来/CPU保证

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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