ARM&Linux基础
+ -

内核同步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); /* 解锁 */

0 篇笔记 写笔记

内核同步Linux&Windows
原子操作windowsLONG InterlockedIncrement(IN PLONG Addend);LONG InterlockedDecrement(IN PLONG Addend);Linuxatomic_t v = ATOMIC_INIT(0); /* 定义并初始化原子变零......
关注公众号
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

您的支持,是我们前进的动力!