零、什么是mutex
A mutex is a mutual exclusion lock. Only one thread can hold the lock.
A mutex can be used to prevent the simultaneous execution of a block of code by multiple threads that are running in a single or multiple processes.
Mutex is used as a synchronization primitive in situations where a resource has to be shared by multiple threads simultaneously.
A mutex has ownership. The thread which locks a Mutex must also unlock it.
一、mutex的使用套路
1.mutex实例对象创建
struct mutex mutex;
2.初始化multex
mutex_init(&globalmem_devp->mutex);
3.用锁保护资源
mutex_lock(&dev->mutex);
memset(dev->mem, 0, GLOBALMEM_SIZE);
mutex_unlock(&dev->mutex);
二、实际上mutex_lock/mutex_unlock的实现
依赖于对mutex->count变量的原子操作
三、原子操作如何实现?
SMP系统中,在C的软件层面上,是不能保证原子性的,那么只有在硬件层面上去保证,庆幸的是armv6及以上的版本支持strex和ldrex指令来保证多核之间的数据同步和控制并发问题。
https://blog.csdn.net/weixin_33975951/article/details/86000607
同样的,X86-64平台也有类似的指令,可以用于实现原子操作,比如:LOCK指令。
通过ldrex与strex指令来保证数据操作的原子性
#define ATOMIC_OP_RETURN(op, c_op, asm_op) \
static inline int atomic_add_return(int i, atomic_t *v) \
{ \
unsigned long tmp; \
int result; \
\
smp_mb(); \
prefetchw(&v->counter); \
\
__asm__ __volatile__("@ atomic_add_return\n" \
"1: ldrex %0, [%3]\n" \
" " #asm_op " %0