Linux之同步机制(信号量,自旋锁)

当我们有两个open函数同时打开同一个设别节点的时候该怎么处理,我们肯定是不希望在同一时刻有两个应用程序都打开了这个驱动,这个时候我们可以才需一些措施。

同一时刻只能够打开一个设备节点,如何实现同一时刻只能有一个进程使用某个设备?使用linux互斥机制

Linux互斥机制有哪些?
答:有很多种,如:原子变量、互斥锁、信号量、自旋锁、读写锁等等

注意以上的集中互斥机制我只会讲解原子变量,信号量。

上一篇文章的链接:http://blog.csdn.net/qq_21792169/article/details/48416773

测试程序是不变的。

代码:下面我例举了原子变量的说有用法,

原子变量
#include<asm/atomic.h>
static atomic_t canopen = ATOMIC_INIT(1); //define atom 
atomic_set(v,i)//v(shi dizhi)是原子变量 *v=i;
atomic_read(v)
atomic_add(i,v)//让*v+=i
atomic_sub(i,v)//让*v-=i
atomic_inc(&canopen)//让*v+=1//减一的定义在open函数当中,但是在close函数应该把它加回来
atomic_dec(v)//让*v-=1

atomic_sub_and_test(i,v)//*v=0;返回结果是真
atomic_add_negative(i,v)//*v<0;返回结果是真
atomic_inc_and_test(v)//*v=0;返回结果是真
atomic_dec_and_test(v)//*v=0;返回结果是真1

信号量:static DECLARE_MUTEX(button_lock);     //定义互斥锁
down(&button_lock);//open时候定义
up(&button_lock);//close时候定义

自旋锁也是很常用的在linux内核中。

时间: 2024-12-05 07:23:13

Linux之同步机制(信号量,自旋锁)的相关文章

Linux内核同步机制之(四):spin lock【转】

转自:http://www.wowotech.net/kernel_synchronization/spinlock.html 一.前言 在linux kernel的实现中,经常会遇到这样的场景:共享数据被中断上下文和进程上下文访问,该如何保护呢?如果只有进程上下文的访问,那么可以考虑使用semaphore或者mutex的锁机制,但是现在中断上下文也参和进来,那些可以导致睡眠的lock就不能使用了,这时候,可以考虑使用spin lock.本文主要介绍了linux kernel中的spin loc

Linux内核同步机制之(三):memory barrier【转】

转自:http://www.wowotech.net/kernel_synchronization/memory-barrier.html 一.前言 我记得以前上学的时候大家经常说的一个词汇叫做所见即所得,有些编程工具是所见即所得的,给程序员带来极大的方便.对于一个c程序员,我们的编写的代码能所见即所得吗?我们看到的c程序的逻辑是否就是最后CPU运行的结果呢?很遗憾,不是,我们的"所见"和最后的执行结果隔着: 1.编译器 2.CPU取指执行 编译器将符合人类思考的逻辑(c代码)翻译成了

Linux线程同步之递归锁

概述 最常见的进程/线程的同步方法有互斥锁(或称互斥量Mutex),读写锁(rdlock),条件变量(cond),信号量(Semophore)等.在Windows系统中,临界区(Critical Section)和事件对象(Event)也是常用的同步方法. 简单的说,互斥锁保护了一个临界区,在这个临界区中,一次最多只能进入一个线程.如果有多个进程在同一个临界区内活动,就有可能产生竞态条件(race condition)导致错误. 读写锁从广义的逻辑上讲,也可以认为是一种共享版的互斥锁.如果对一个

原子变量与非阻塞同步机制(第十五章)

原子变量与非阻塞同步机制 与基于锁的方案相比,非阻塞算法在设计和实现上都要负责得多,但它们在可伸缩性和活跃性上拥有巨大的优势. 原子变量提供了与volatile类型变量相同的内存语义,此外还支持原子的更新操作,从而使它们更加适用于实现计数器.序列发生器和统计数据收集等,同时还能比基于锁的方法提供更高的可伸缩性. 独占锁是一种悲观技术----它假设最坏的情况. 现在,几乎所有的现代处理器中都包含了某种形式的原子读-改-写指令,例如比较并交换(Compare-and-Swap)或者关联加载/条件存储

Linux 内核同步之自旋锁与信号量的异同【转】

转自:http://blog.csdn.net/liuxd3000/article/details/8567070 Linux 设备驱动中必须解决的一个问题是多个进程对共享资源的并发访问,并发访问会导致竞态,linux 提供了多种解决竞态问题的方式,这些方式适合不同的应用场景.   Linux 内核是多进程.多线程的操作系统,它提供了相当完整的内核同步方法.内核同步方法列表如下: 中断屏蔽 原子操作 自旋锁 读写自旋锁 顺序锁 信号量 读写信号量 BKL (大内核锁) Seq 锁 一.并发与竞态

linux 自旋锁和信号量【转】

转自:http://blog.csdn.net/xu_guo/article/details/6072823 版权声明:本文为博主原创文章,未经博主允许不得转载.   自旋锁最多只能被一个可执行线程持有(读写自旋锁除外).自旋锁不会引起调用者睡眠,如果一个执行线程试图获得一个已经被持有的自旋锁,那么线程就会一直进行忙循环,一直等待下去(一直占用 CPU ),在那里看是否该自旋锁的保持者已经释放了锁, " 自旋 " 一词就是因此而得名. 由于自旋锁使用者一般保持锁时间非常短,因此选择自旋

大话Linux内核中锁机制之原子操作、自旋锁【转】

转自:http://blog.sina.com.cn/s/blog_6d7fa49b01014q7p.html 多人会问这样的问题,Linux内核中提供了各式各样的同步锁机制到底有何作用?追根到底其实是由于操作系统中存在多进程对共享资源的并发访问,从而引起了进程间的竞态.这其中包括了我们所熟知的SMP系统,多核间的相互竞争资源,单CPU之间的相互竞争,中断和进程间的相互抢占等诸多问题. 通常情况下,如图1所示,对于一段程序,我们的理想是总是美好的,希望它能够这样执行:进程1先对临界区完成操作,然

大话Linux内核中锁机制之原子操作、自旋锁

转至:http://blog.sina.com.cn/s/blog_6d7fa49b01014q7p.html 很多人会问这样的问题,Linux内核中提供了各式各样的同步锁机制到底有何作用?追根到底其实是由于操作系统中存在多进程对共享资源的并发访问,从而引起了进程间的竞态.这其中包括了我们所熟知的SMP系统,多核间的相互竞争资源,单CPU之间的相互竞争,中断和进程间的相互抢占等诸多问题. 通常情况下,如图1所示,对于一段程序,我们的理想是总是美好的,希望它能够这样执行:进程1先对临界区完成操作,

linux内核同步之每CPU变量、原子操作、内存屏障、自旋锁【转】

转自:http://blog.csdn.net/goodluckwhh/article/details/9005585 版权声明:本文为博主原创文章,未经博主允许不得转载.   目录(?)[-] 一每CPU变量 二原子操作 三优化和内存屏障 四自旋锁 自旋锁 自旋锁的数据结构和宏函数 读写自旋锁 读写自旋锁的相关函数   linux内核中的各种"任务"都能看到内核地址空间,因而它们之间也需要同步和互斥.linux内核支持的同步/互斥手段包括:   技术 功能 作用范围 每CPU变量 为