自旋锁 Spin Lock

来自:楚狂人驱动基础教程

作用:涉及到恼人的多线程同步问题,例如,多线程访问链表,LIST_ENTRY 这时候就必须使用锁

过程:

1.初始化

   KSPIN_LOCK my_spin_lock;

   KeInitializeSpinLock(&my_spin_lock);

2.执行过程:在KeAcquireSpinLock和KeReleaseSpinLock之间的代码是只有单线程执行的。其他的线程会停留在KeAcquireSpinLock等候

    KIRQLirql;//一个中断级

    KeAcquireSpinLock(&my_spin_lock,&irql);

    // Todo something …

    KeReleaseSpinLock(&my_spin_lock,irql);

注意:下面过程是无意义的,实际上并未加锁,使因为 my_spin_lock在堆栈中,每个线程都会重新初始化一个锁,只有所有线程公用一个所才有意义,故my_spin_lock需要定义为全局变量 ,静态变量

void MySafeFunction()

    {

        KSPIN_LOCK my_spin_lock;

        KIRQL  irql;

        KeInitializeSpinLock(&my_spin_lock);

        KeAcquireSpinLock(&my_spin_lock,&irql);

           // Todo something …

        KeReleaseSpinLock(&my_spin_lock,irql);

    }



你可能感兴趣的:(内核函数,齐齐来踢球)