/* 32bit */typedef LONG atomic_t;#defineLONG.wordk/* 64bit */typedefstruct{longlong counter;}atomic64_t;
实例
#ifdef_TEST_ATOMIC_32/* 32bit */int val_a =0;atomic_t a =ATOMIC_INIT(0);// int a = 32;// set / readatomic_set(&a,32);// a = 100;val_a =atomic_read(&a);// VAL = a;// add / subatomic_add(1,&a);// a = a + 1;atomic_sub(2,&a);// a = a - 1;// inc / decatomic_inc(&a);// a++;atomic_dec(&a);// a--;#else/* 64bit */u64 val_b =0;// unsigned long long val_b = 0;atomic64_t b =ATOMIC64_INIT(0);// unsigned long long b = 0;// set / readatomic64_set(&b,64);// b = 64val_b =atomic64_read(&b);// VAL = b;// add / subatomic64_add(1,&b);// b = b + 1;atomic64_sub(2,&b);// b = b - 1;// inc / decatomic64_inc(&b);// b++;atomic64_dec(&b);// b--;#endif
#include<linux/spinlock_types.h>staticDEFINE_SPINLOCK(vga_lock);// init{unsignedlong flags;spin_lock_irqsave(&test_spinlock, flags);{// do something}spin_unlock_irqrestore(&test_spinlock, flags);}#if0{/* in irq */spin_lock();spin_unlock();}#endif