相关专题: Linux设备驱动程序开发入门 在驱动程序中,当多个线程同时访问相同的资源时(驱动程序中的全局变量是一种典型的共享资源),可能会引发"竞态",因此我们必须对共享资源进行并发控制。Linux内核中解决并发控制的最常用方法是自旋锁与信号量(绝大多数时候作为互斥锁使用)。
初始化信号量
该函数初始化信号量,并设置信号量sem的值为val
该函数用于初始化一个互斥锁,即它把信号量sem的值设置为1,等同于sema_init (struct semaphore *sem, 1);
该函数也用于初始化一个互斥锁,但它把信号量sem的值设置为0,等同于sema_init (struct semaphore *sem, 0); 获得信号量
该函数用于获得信号量sem,它会导致睡眠,因此不能在中断上下文使用;
该函数功能与down类似,不同之处为,down不能被信号打断,但down_interruptible能被信号打断;
该函数尝试获得信号量sem,如果能够立刻获得,它就获得该信号量并返回0,否则,返回非0值。它不会导致调用者睡眠,可以在中断上下文使用。 释放信号量
该函数释放信号量sem,唤醒等待者。 与自旋锁相关的API主要有: 定义自旋锁
初始化自旋锁
该宏用于动态初始化自旋锁lock 获得自旋锁
该宏用于获得自旋锁lock,如果能够立即获得锁,它就马上返回,否则,它将自旋在那里,直到该自旋锁的保持者释放;
该宏尝试获得自旋锁lock,如果能立即获得锁,它获得锁并返回真,否则立即返回假,实际上不再"在原地打转"; 释放自旋锁
该宏释放自旋锁lock,它与spin_trylock或spin_lock配对使用; 除此之外,还有一组自旋锁使用于中断情况下的API。 (作者:宋宝华责任编辑:方舟)
相关文章
评论
|
|