首页 > 代码库 > CAS原子锁 高效自旋无锁的正确用法
CAS原子锁 高效自旋无锁的正确用法
1 #pragma once 2 #ifndef _atomic_lock_h_include_ 3 #define _atomic_lock_h_include_ 4 5 #include <windows.h> 6 7 #define cpu_pause() __asm {pause} 8 #define thread_yield() Yield() 9 10 #define spin_num (2048) 11 12 typedef struct { 13 volatile long lock; 14 } app_atomic_lock_t; 15 16 __forceinline int compare_and_swap(long volatile *des, long out, long set) 17 { 18 InterlockedCompareExchange(des, set, out); 19 return *des == set; 20 } 21 22 int app_atomic_trylock(app_atomic_lock_t* lt, long value); 23 24 void app_atomic_lock(app_atomic_lock_t* lt, long value); 25 26 void app_atomic_unlock(app_atomic_lock_t* lt, long value); 27 #endif
1 #include "atomic_lock.h" 2 3 int app_atomic_trylock(app_atomic_lock_t * lt, long value) 4 { 5 return (lt->lock == 0 && 6 compare_and_swap(<->lock, 0, value)); 7 return 0; 8 } 9 10 void app_atomic_lock(app_atomic_lock_t * lt, long value) 11 { 12 u_int n, i; 13 14 for (;; ) { 15 16 if (lt->lock == 0 && compare_and_swap(<->lock, 0, value)) { 17 return; 18 } 19 for (n = 1; n < spin_num; n <<= 1) { 20 21 for (i = 0; i < n; i++) { 22 cpu_pause(); 23 } 24 25 if (lt->lock == 0 && compare_and_swap(<->lock, 0, value)) { 26 return; 27 } 28 } 29 30 thread_yield(); 31 } 32 } 33 34 void app_atomic_unlock(app_atomic_lock_t * lt, long value) 35 { 36 return compare_and_swap(<->lock, value, 0); 37 }
cas在loop抢占的时候,会大量消耗cpu,在x86指令集下,可以用pause指令来减少loop的消耗。
cas锁在极高并发时候,会有非常大的帮助,相反,并发不高或者抢占时间过长,则千万不要用cas无锁。
以上代码只能在x86下编译,x64不能通过,需要重写pause指令实现。
CAS原子锁 高效自旋无锁的正确用法
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。