东莞做网站优化,湖州长兴做网站,网站建设到底属于什么行业,京东网站开发技术目录
1. 原子操作
2. 锁是干嘛的
3. 锁的实现 1. 原子操作 gcc从4.1.2开始提供了__sync_*系列的build-in函数#xff0c;用于提供加减和逻辑运算的原子操作#xff0c;主要接口的其声明如下#xff1a;
type __sync_fetch_and_add (type *ptr, type value, ...): 将valu…目录
1. 原子操作
2. 锁是干嘛的
3. 锁的实现 1. 原子操作 gcc从4.1.2开始提供了__sync_*系列的build-in函数用于提供加减和逻辑运算的原子操作主要接口的其声明如下
type __sync_fetch_and_add (type *ptr, type value, ...): 将value加到ptr上结果更新到ptr并返回操作之前*ptr的值type __sync_fetch_and_sub (type *ptr, type value, ...):从ptr减去value结果更新到ptr并返回操作之前*ptr的值type __sync_fetch_and_or (type *ptr, type value, ...): 将ptr与value相或结果更新到ptr 并返回操作之前*ptr的值type __sync_fetch_and_and (type *ptr, type value, ...): 将ptr与value相与结果更新到ptr并返回操作之前ptr的值type __sync_fetch_and_xor (type *ptr, type value, ...):将ptr与value异或结果更新到ptr并返回操作之前ptr的值type __sync_fetch_and_nand (type *ptr, type value, ...): 将ptr取反后与value相与结果更新到ptr并返回操作之前ptr的值type __sync_add_and_fetch (type *ptr, type value, ...):将value加到ptr上结果更新到ptr并返回操作之后新ptr的值type __sync_sub_and_fetch (type *ptr, type value, ...):从ptr减去value结果更新到ptr并返回操作之后新*ptr的值type __sync_or_and_fetch (type *ptr, type value, ...):将ptr与value相或 结果更新到ptr并返回操作之后新*ptr的值type __sync_and_and_fetch (type *ptr, type value, ...):将ptr与value相与结果更新到ptr并返回操作之后新*ptr的值type __sync_xor_and_fetch (type *ptr, type value, ...):将ptr与value异或结果更新到ptr并返回操作之后新ptr的值type __sync_nand_and_fetch (type *ptr, type value, ...):将ptr取反后与value相与结果更新到ptr并返回操作之后新ptr的值bool __sync_bool_compare_and_swap (type *ptr, type oldval type newval, ...):比较*ptr与oldval的值如果两者相等则将newval更新到*ptr并返回truetype __sync_val_compare_and_swap (type *ptr, type oldval type newval, ...):比较ptr与oldval的值如果两者相等则将newval更新到ptr并返回操作之前*ptr的值__sync_synchronize (...):发出完整内存栅栏type __sync_lock_test_and_set (type *ptr, type value, ...): 将value写入ptr对ptr加锁并返回操作之前*ptr的值。即try spinlock语义void __sync_lock_release (type *ptr, ...)将0写入到ptr并对ptr解锁。即unlock spinlock语义
2. 锁是干嘛的
锁解决的问题为了并行中的正确性共享数据一致性 多核处理器多个CPU如果同时访问一些共享资源可能会导致数据不一致即共享数据用锁设置成多CPU分时访问。
锁带来的问题并行变串行效率降低
3. 锁的实现
上锁
__sync_lock_test_and_set
通过原子操作赋值也就是锁只能一方获取。
解锁
__sync_lock_release
通过原子操作清0。 锁的操作均是原子操作但是实现锁的功能还需要内存屏蔽功能保证临界区的执行可靠性。某些平台的部分代码
#define SPINLOCK_INIT \{ \0 \}#define CORELOCK_INIT \{ \.lock SPINLOCK_INIT, \.count 0, \.core -1 \}/* Defination of memory barrier macro */
#define mb() \{ \asm volatile(fence :: \: memory); \}#define atomic_set(ptr, val) (*(volatile typeof(*(ptr)) *)(ptr) val)
#define atomic_read(ptr) (*(volatile typeof(*(ptr)) *)(ptr))
#define atomic_get(ptr) (*(volatile typeof(*(ptr)) *)(ptr))#ifndef __riscv_atomic
#error atomic extension is required.
#endif
#define atomic_add(ptr, inc) __sync_fetch_and_add(ptr, inc)
#define atomic_sub(ptr, inc) __sync_fetch_and_sub(ptr, inc)
#define atomic_sub_return(ptr, inc) __sync_sub_and_fetch (ptr, inc)
#define atomic_or(ptr, inc) __sync_fetch_and_or(ptr, inc)
#define atomic_swap(ptr, swp) __sync_lock_test_and_set(ptr, swp)
#define atomic_cas(ptr, cmp, swp) __sync_val_compare_and_swap(ptr, cmp, swp)typedef struct _spinlock
{int lock;
} spinlock_t;typedef struct _semaphore
{spinlock_t lock;int count;int waiting;
} semaphore_t;typedef struct _corelock
{spinlock_t lock;int count;int core;
} corelock_t;static inline int spinlock_trylock(spinlock_t *lock)
{int res atomic_swap(lock-lock, -1);/* Use memory barrier to keep coherency */mb();return res;
}static inline void spinlock_lock(spinlock_t *lock)
{while(spinlock_trylock(lock));
}static inline void spinlock_unlock(spinlock_t *lock)
{/* Use memory barrier to keep coherency */mb();atomic_set(lock-lock, 0);asm volatile(nop);
}