内核同步Linux&Windows
2025-11-19
16
0
原子操作
windows
LONG InterlockedIncrement(IN PLONG Addend);
LONG InterlockedDecrement(IN PLONG Addend);
Linux
atomic_t v = ATOMIC_INIT(0); /* 定义并初始化原子变零 v=0 */
atomic_set(&v, 10); /* 设置 v=10 */
atomic_read(&v); /* 读取 v 的值,肯定是 10 */
atomic_inc(&v); /* v 的值加 1, v=11 */
| 函数 | 描述 |
|---|---|
| ATOMIC_INIT(int i) | 定义原子变量的时候对其初始化。 |
| atomic_read(atomic_t *v) | 读取 v 的值,并且返回。 |
| atomic_set(atomic_t *v, int i) | 向 v 写入 i 值。 |
| atomic_add(int i, atomic_t *v) | 给 v 加上 i 值。 |
| atomic_sub(int i, atomic_t *v) | 从 v 减去 i 值。 |
| atomic_inc(atomic_t *v) | 给 v 加 1,也就是自增。 |
| atomic_dec(atomic_t *v) | 从 v 减 1,也就是自减。 |
| atomic_dec_return(atomic_t *v) | 从 v 减 1,并且返回 v 的值。 |
| atomic_inc_return(atomic_t *v) | 给 v 加 1,并且返回 v 的值。 |
| atomic_sub_and_test(int i, atomic_t *v) | 从 v 减 i,如果结果为 0 就返回真,否则返回假。 |
| atomic_dec_and_test(atomic_t *v) | 从 v 减 1,如果结果为 0 就返回真,否则返回假。 |
| atomic_inc_and_test(atomic_t *v) | 给 v 加 1,如果结果为 0 就返回真,否则返回假。 |
| atomic_add_negative(int i, atomic_t *v) | 给 v 加 i,如果结果为负就返回真,否则返回假。 |
自旋锁
Windows下自旋锁初始化
KSPIN_LOCK my_spin_lock;
KeInitializeSpinLock(&my_spin_lock);
Windows下旋锁使用
KIRQL irql;
KeAcquireSpinLock(&my_spin_lock,&irql);
// To do something …
KeReleaseSpinLock(&my_spin_lock,irql);
Linux下自旋锁初始化
spinlock_t lock;
spin_lock_irq(&lock);
或使用
DEFINE_SPINLOCK(lock);
Linux下自旋锁使用
/* 线程 A */
void functionA (){
unsigned long flags; /* 中断状态 */
spin_lock_irqsave(&lock, flags) /* 获取锁 */
/* 临界区 */
spin_unlock_irqrestore(&lock, flags) /* 释放锁 */
}
/* 中断服务函数 */
void irq() {
spin_lock(&lock) /* 获取锁 */
/* 临界区 */
spin_unlock(&lock) /* 释放锁 */
}
/*下半部*/
void bh(){
spin_lock_bh(&lock);
/* 临界区 */
spin_unlock_bh(&lock);
}
信号量
KSEMAPHORE FdoReadFrameSemaphore;
KeInitializeSemaphore(&FdoReadFrameSemaphore, 30, MAXLONG);
LARGE_INTEGER interval;
interval.QuadPart = 30 * -10000;
NTSTATUS ntStatus = KeWaitForSingleObject(&FdoReadFrameSemaphore, Executive, KernelMode, FALSE, &interval);
KeReleaseSemaphore(&FdoReadFrameSemaphore, IO_NO_INCREMENT, 1, FALSE);
count = KeReadStateSemaphore(&FdoReadFrameSemaphore))
linux
struct semaphore sem; /* 定义信号量 */
sema_init(&sem, 1); /* 初始化信号量 */
down(&sem); /* 申请信号量 */
/* 临界区 */
up(&sem); /* 释放信号量 *
互斥体
Windows
PFAST_MUTEX FastMutex
ExInitializeFastMutex(&FastMutex);
ExAcquireFastMutex(&FastMutex);
// 临界区代码
// 在这里执行需要同步的操作
ExReleaseFastMutex(&FastMutex);
Linux
struct mutex lock; /* 定义一个互斥体 */
mutex_init(&lock); /* 初始化互斥体 */
mutex_lock(&lock); /* 上锁 */
/* 临界区 */
mutex_unlock(&lock); /* 解锁 */
ARM&Linux基础





