| 原子整数操作 | 描述 |
| ATOMIC_INIT(int i) | 在声明一个atomic_t变量时,将它初始化为i |
| int atomic_read(atomic_t *v) | 原子地读取整数变量v |
| void atomic_set(atomic_t *v, int i) | 原子地设置v值为i |
| void atomic_add(int i, atomic_t *v) | 原子地给v加i |
| void atomic_sub(int i, atomic_t *v) | 原子地从v减i |
| void atomic_inc(atomic_t *v) | 原子地给v加1 |
| void atomic_dec(atomic_t *v) | 原子地给v减1 |
| int atomic_sub_and_test(int i, atomic_t *v) | 原子地从v减i,若结果等于0返回真,否则返回假 |
| int atomic_add_negative(int i, atomic_t *v) | 原子地从v加i,若结果是负数返回真,否则返回假 |
| int atomic_dec_and_test(atomic_t *v) | 原子地从v减1,若结果等于0返回真,否则返回假 |
| int atomic_inc_and_test(atomic_t *v) | 原子地从v加1,若结果等于0返回真,否则返回假 |
| 原子位操作 | 描述 |
| void set_bit(int nr, void *addr) | 原子地设置addr所指对象的第nr位 |
| void clear_bit(int nr, void *addr) | 原子地清空addr所指对象的第nr位 |
| void change_bit(int nr, void *addr) | 原子地翻转addr所指对象的第nr位 |
| int test_and_set_bit(int nr, void *addr) | 原子地设置addr所指对象的第nr位,并返回原先的值 |
| int test_and_clear_bit(int nr, void *addr) | 原子地清空addr所指对象的第nr位,并返回原先的值 |
| int test_and_change_bit(int nr, void *addr) | 原子地翻转addr所指对象的第nr位,并返回原先的值 |
| int test_bit(int nr, void *addr) | 原子地返回addr所指对象的第nr位 |
| 方法 | 描述 |
| spin_lock( ) | 获取指定的自旋锁 |
| spin_lock_irq( ) | 禁止本地中断并获取指定的锁 |
| spin_lock_irqsave( ) | 保存本地中断的当前状态,禁止本地中断,并获取指定的锁 |
| spin_unlock( ) | 释放指定的锁 |
| spin_unlock_irq( ) | 释放指定的锁,并激活本地中断 |
| spin_unlock_irqrestore( ) | 释放指定的锁,并让本地中断恢复到以前的状态 |
| spin_lock_init( ) | 初始化指定的spinlock_t |
| spin_trylock( ) | 试图获取指定的锁,如果未获取则返回非0 |
| spin_is_locked( ) | 如果指定的锁当前正在被获取则返回非0,否则返回0 |
| spin_lock_bh( ) | 禁止所有下半部的执行,并获取指定的锁 |
| spin_unlock_bh( ) | 释放指定的锁,允许下半部的执行 |
| 方法 | 描述 |
| read_lock( ) | 获取指定的读锁 |
| read_lock_irq( ) | 禁止本地中断并获取指定的读锁 |
| read_lock_irqsave( ) | 保存本地中断的当前状态,禁止本地中断并获取指定的读锁 |
| read_unlock( ) | 释放指定的读锁 |
| read_unlock_irq( ) | 释放指定的读锁,并激活本地中断 |
| read_unlock_irqrestore( ) | 释放指定的读锁,并让本地中断恢复到以前的状态 |
| write_lock( ) | 获取指定的写锁 |
| write_lock_irq( ) | 禁止本地中断并获取指定的写锁 |
| write_lock_irqsave( ) | 保存本地中断的当前状态,禁止本地中断并获取指定的写锁 |
| write_unlock( ) | 释放指定的写锁 |
| write_unlock_irq( ) | 释放指定的写锁,并激活本地中断 |
| write_unlock_irqrestore( ) | 释放指定的写锁,并让本地中断恢复到以前的状态 |
| write_trylock( ) | 试图获得指定的写锁;如果写锁不可用,返回非0值 |
| rw_lock_init( ) | 初始化指定的rwlock_t |
| rw_is_locked( ) | 如果指定的锁当前已被持有,该函数返回非0值,否则返回0 |
| 方法 | 描述 |
| sema_init(struct semaphore *, int) | 以指定的计数值初始化动态创建的信号量 |
| init_MUTEX(struct semaphore *) | 以计数值1初始化动态创建的信号量 |
| init_MUTEX_LOCKED(struct semaphore *) | 以计数值0初始化动态创建的信号量(初始化为加锁状态) |
| down_interruptible(struct semaphore *) | 试图获得指定的信号量,如果信号已被争用,则进入可中断睡眠状态 |
| down(struct semaphore *) | 试图获得指定的信号量,如果信号已被争用,则进入不可中断睡眠状态 |
| down_trylock(struct semaphore *) | 试图获得指定的信号量,如果信号已被争用,则立刻返回非0值 |
| up(struct semaphore *) | 释放指定的信号量,如果睡眠队列不空,则唤醒其中的一个任务 |
| 方法 | 描述 |
| init_completion(struct completion *) | 初始化指定的动态创建的完成变量 |
| wait_for_completion(struct completion *) | 等待指定的完成变量接受信号 |
| completion(struct completion *) | 发信号唤醒任何等待任务 |
| 方法 | 描述 |
| Preempt_disable( ) | 禁止内核抢占 |
| Preempt_enable( ) | 激活内核抢占并检查和执行被挂起的需要调度的任务 |
| Preempt_enable_no_resched( ) | 激活内核抢占但不再进行调度 |
| Preempt_count( ) | 返回抢占计数 |
| 方法 | 描述 |
| rmb( ) | 阻止跨跃屏障的载入动作发生重排序 |
| read_barrier_depends( ) | 阻止跨跃屏障的具有数据依赖关系的载入动作重排序 |
| wmb( ) | 阻止跨跃屏障的存储动作发生重排序 |
| mb( ) | 阻止跨跃屏障的载入和存储动作重新排序 |
| smp_rmb( ) | 在SMP上提供rmb( )功能,在UP上提供barrier( )功能 |
| smp_read_barrier_depends( ) | 在SMP上提供read_barrier_depends( )功能,在UP上提供barrier( )功能 |
| smp_wmb( ) | 在SMP上提供wmb( )功能,在UP上提供barrier( )功能 |
| smp_mb( ) | 在SMP上提供mb( )功能,在UP上提供barrier( )功能 |
| barrier( ) | 组织编译器跨屏障对载入或存储操作进行优化 |
本文介绍了Linux内核中的多种同步机制,包括原子操作、自旋锁、读写自旋锁、信号量、读写信号量、完成变量、Seq锁、禁止抢占及内存屏障等。这些机制确保了多处理器环境下数据的一致性和完整性。
2999

被折叠的 条评论
为什么被折叠?



