typedef struct {
volatile int counter;
} atomic_t;
atomic_t v = ATOMIC_INIT(0); /*定义原子变量 v 并初始化为 0*/
void atomic_set (atomic_t *v, int i); /*设置 *v 为 i*/
atomic_read (atomic_t *v); /*返回 *v 的值*/
void atomic_add (atomic_t *v);
void atomic_sub (atomic_t *v);
void atomic_inc (atomic_t *v); /* *v 加 1*/
void atomic_dec (atomic_t *v) /* *v 减 1*/
int atomic_inc_and_test (atomic_t *v);
int atomic_dec_and_test (atomic_t *v);
int atomic_sub_and_test (atomic_t *v);
上述操作对原子变量执行自增、自减和减操作后(注意没有加),测试其是否为 0 ,为 0 则返回 true ,否则返回 false 。
int atomic_add_returen (int i, atomic_t *v);
int atomic_sub_returen (int i, atomic_t *v);
int atomic_inc_returen (int i, atomic_t *v);
int atomic_dec_returen (int i, atomic_t *v);
上述操作对原子变量进行加/减 和 自增/自减操作,并返回新值。
void set_bit (nr, void *addr);
addr 地址的第 nr 位,置位即将位写为1。
void clear_bit (nr, void *addr);
清除地址 addr 上的第 nr 位,即对其位写0。
void change_bit (nr, void *addr);
对 addr 上的第 nr 进行反置。
test_bit (nr, void *addr);
返回 addr 地址上的第 nr 位。
int test_and_set_bit (nr, void *addr);
int test_and_clear_bit (nr, void *addr);
int test_and_change_bit (nr, void *addr);
typedef struct {
raw_spinlock_t raw_lock;
#ifdef CONFIG_GENERIC_LOCKBREAK
unsigned int break_lock;
#endif
#ifdef CONFIG_DEBUG_SPINLOCK
unsigned int magic, owner_cpu;
void *owner;
#endif
#ifdef CONFIG_DEBUG_LOCK_ALLOC
struct lockdep_map dep_map;
#endif
} spinlock_t;
typedef struct {
volatile unsigned int slock;
} raw_spinlock_t;
spinlock_t lock;
spin_lock_init (&lock);
spin_lock (&lock); /*获得自旋锁,保护临界区*/
...//临界区
spin_unlock (&lock); /*解锁*/
spin_lock_irq() = spin_lock() + local_irq_disable()
spin_unlock_irq() = spin_unlock() + local_irq_enable()
spin_lock_irqsave() = spin_lock() + local_irq_save()
spin_unlock_irqrestore() = spin_unlock() + local_irq_restore()
spin_lock_bh() = spin_lock() + local_bh_disable()
spin_unlock_bh() = spin_unlock() + local_bh_enable()
int xxx_count = 0; /*定义文件打开次数*/
static int xxx_open (struct inode *inode, struct file *filp)
{
...
spin_lock (&xxx_lock); /*获取自旋锁*/
if (xxx_count){ /*获得自旋锁,但已有别的进程打开设备*/
spin_unlock (&xxx_lock); /*设备忙,释放自旋锁返回*/
reurn (-EBUSY);
}
xxx_count++; /*没有别的进程使用设备,增加使用计数*/
spin_unlock (&xxx_lock); /*已经成功打开设备,释放自旋锁*/
...
return (0); /*打开成功*/
}
static int xxx_release (struct inode *inode, struct file *filp)
{
...
spin_lock (&xxx_lock); /*获得自旋锁*/
xxx_count--; /*减少使用计数*/
spin_unlock (&xxx_lock);
return (0);
}
rwlock_t my_rwlock = RW_LOCK_UNLOCKED; /*静态初始化*/
rwlock_t my_rwlock;
rwlock_init (&my_rwlock); /*动态初始化*/
void read_lock (rwlock_t *lock);
void read_lock_iqrsave (rwlock_t *lock, unsigned long flags);
void read_lock_irq (rwlock_t *lock);
void read_lock_bh (rwlock_t *lock);
void read_unlock (rwlock_t *lock);
void read_unlock_irqrestore (rwlock_t *lock, unsigned long flags);
void read_unlock_iqr (rwlock_t *lock);
void read_unlock_bh (rwlock_t *lock);
void write_lock (rwlock_t *lock);
void write_lock_irqsave (rwlock_t *lock, unsigned long flags);
void write_lock_irq (rwlock_t *lock);
void write_lock_bh (rwlock_t *lock);
int write_trylock (rwlock_t *lock);
void write_unlock (rwlock_t *lock);
void write_unlock_iqrrestore (rwlock_t *lock, unsigned long flags);
void write_unlock_iqr (rwlock_t *lock);
void write_unlock_bh (rwlock_t *lock);
rwlock_t lock; /*定义 rwlock */
rwlock_init (&lock); /*初始化 rwlock*/
/*读时获取锁*/
read_lock (&lock);
...//临界资源
read_unlock (&lock);
/*写获取锁*/
write_lock_irqsave (&lock, flags);
...//临界资源
write_unlock_irqrestore (&lock, flags);
欢迎光临 曲径通幽论坛 (http://www.groad.net/bbs/) | Powered by Discuz! X3.2 |