Linux 并发与竞争
原子操作
atomic_t v = ATOMIC_INIT(0);
atomic_set(&v, 10);
atomic_read(&v);
atomic_inc(&v);
自旋锁
DEFINE_SPINLOCK(lock)
void functionA (){
unsigned long flags;
spin_lock_irqsave(&lock, flags)
spin_unlock_irqrestore(&lock, flags)
}
void irq() {
spin_lock(&lock)
spin_unlock(&lock)
}
互斥体
struct mutex {
atomic_t count;
spinlock_t wait_lock;
};
Linux 内核定时器
示例代码 50.1.1.3 使用 jiffies 判断超时
unsigned long timeout;
timeout = jiffies + (2 * HZ);
if(time_before(jiffies, timeout)) {
} else {
}
示例代码 50.1.2.1 timer_list 结构体
struct timer_list {
struct list_head entry;
unsigned long expires;
struct tvec_base *base;
void (*function)(unsigned long);
unsigned long data;
int slack;
};
示例代码 50.1.2.2 内核定时器使用方法演示
struct timer_list timer;
void function(unsigned long arg)
{
mod_timer(&dev->timertest, jiffies + msecs_to_jiffies(2000));
}
void init(void)
{
init_timer(&timer);
timer.function = function;
timer.expires=jffies + msecs_to_jiffies(2000);
timer.data = (unsigned long)&dev;
add_timer(&timer);
}
void exit(void)
{
del_timer(&timer);
del_timer_sync(&timer);
}