一.并发控制
(1)自旋锁
得不到资源,会原地打转,直到获得资源为止
定义自旋锁
spinlock_t spin;
初始化自旋锁
spin_lock_init(lock);
获得自旋锁
spin_lock(lock);获得自旋锁,如果能立即获得,则马上返回,否则自旋在那里,直到该自旋锁的保持者释放
spin_trylock(lock);尝试获得自旋锁,如果能立即获得,它获得并返回真,否则立即返回假,实际上,不再“在原地打转”
       释放自旋锁
spin_unlock(lock);与spin_trylock或者spin_lock配对使用
使用方法:
spinlock_t lock;
spin_lock_init(&lock);

spin_lock(&lock);//获取自旋锁,保护临界区
...//临界区
spin_unlock(&lock);//解锁

eg:使用自旋锁使设备只能被一个进程打开
int xxx_count=0;
static int xxx_open(struct inode *inode, struct file *filp)
{
...
spinlock(&xxx_lock);
if(xxx_count)
{
spin_unlock(&xxx_lock);
return -EBUSY;
}
xxx_count++;
spin_unlock(&xxx_lock);
...
return 0;
}
static int xxx_release(struct inode *inode,struct file *filp)
{
...
spinlock(&xxx_lock);
xxx_count--;
spin_unlock(&xxx_lock);

return 0;
}
(2)信号量
得不到资源,会进入休眠状态   
定义信号量
struct semaphore sem;
初始化信号量
void sema_init(struct semaphore *sem,int val);初始化并设置为val
void init_MUTEX(struct semaphore *sem);初始化并设置为1
void init_MUTEX_LOCKED(struct semaphore *sem);初始化并设置为0
下面两个宏用于定义并初始化信号量的“快捷方式”
DECLARE_MUTEX(name);初始化并设置为1
DECLARE_MUTEX_LOCKED(name);初始化并设置为0
获得信号量
void down(struct semaphore *sem);会导致休眠,不能在中断上下文使用
int down_interruptible(struct semaphore *sem);不会导致休眠,可在中断上下文使用
使用down_interruptible()获得信号量时,常对返回值进行检查
if(down_interruptible(&sem))
{
return -ERESTARTSYS;
}
释放信号量
void up(struct semaphore *sem);释放信号量sem,唤醒等待者
使用方法:
DECLARE_MUTEX(mount_sem);
down(&mount_sem);获取信号量,保护临界区
...
critical section //临界区
...
up(&mount_sem);//释放信号量
eg:使用信号量实现设备只能被一个进程打开
static DECLARE_MUTEX(xxx_lock);//定义互斥锁
static int xxx_open(struct inode *inode,struct file *filp)
{
...
if(down_trylock(&xxx_lock))//获得打开锁
return -EBUSY;//设备忙
...
return 0;
}
static int xxx_release(struct inode *inode,struct file *filp)
{
up(&xxx_lock);//释放打开锁
return 0;
}               
总结:在多CPU中需要自旋锁来互斥,当进程占用资源时间较长,使用信号量。当所要保护的临界区访问时间较短,用自旋锁,它节省了上下文切换的时间。
     信号量所保护的临界区可包含可能引起阻塞的代码,自旋锁不能包含。阻塞意味着进行进程的切换,如果进程被切换出去后,另一个进程企图获取本自旋锁,死锁会发生。
     信号量存在进程上下文,如果被保护的共享资源需要在中断或软中断情况下使用,只能使用自旋锁,如果一定要使用信号量,只能通过down_trylock()方式进行,不能获取就立即返回避免阻塞。
     自旋锁会导致死循环,锁定期间不允许阻塞,锁定的临界区要小。
(3)互斥体
信号量已经可以实现互斥的功能,但是mutex还是在linux中真实存在
定义并初始化
struct mutex my_mutex;
mutex_init(&my_mutex);
获取互斥体
void fastcall mutex_lock(struct mutex *lock);
int fastcall mutex_lock_interruptible(strutct mutex *lock);
int fastcall mutex_trylock(struct mutex *lock);
释放互斥体
void fastcall mutex_unlock(struct mutex *lock);
使用方法
struct mutex my_mutex;
mutex_init(&my_mutex);

mutex_lock(&my_mutex);
...//临界资源
mutex_unlock(&my_mutex);

linux同步机制2的更多相关文章

  1. 【av68676164(p31-p32)】Windows和Linux同步机制

    4.6.1 Windows同步机制 临界区(CRITICAL_SECTION) 在进程内使用,保证仅一个线程可以申请到该对象 临界区内是临界资源的访问 相关的API函数 初始化临界区 WINBASEA ...

  2. Linux同步机制(二) - 条件变量,信号量,文件锁,栅栏

    1 条件变量 条件变量是一种同步机制,允许线程挂起,直到共享数据上的某些条件得到满足. 1.1 相关函数 #include <pthread.h>  pthread_cond_t cond ...

  3. Linux同步机制(一) - 线程锁

    1 互斥锁 在线程实际运行过程中,我们经常需要多个线程保持同步. 这时可以用互斥锁来完成任务.互斥锁的使用过程中,主要有 pthread_mutex_init pthread_mutex_destor ...

  4. linux 同步机制之complete【转】

    转自: http://blog.csdn.net/wealoong/article/details/8490654 在Linux内核中,completion是一种简单的同步机制,标志"thi ...

  5. linux同步机制

    很早之前就接触过同步这个概念了,但是一直都很模糊,没有深入地学习了解过,近期有时间了,就花时间研习了一下<linux内核标准教程>和<深入linux设备驱动程序内核机制>这两本 ...

  6. Linux同步机制 - 多线程开发总结

    1 对于CPU开销大的场景,能利用多核,就尽量利用多核(常常自以为某需求的运算量不大,且CPU足够快,就偷懒写个单线程,结果效率很低) 2 使用多线程的时候,默认是加锁的.在加锁保证业务正常的条件下, ...

  7. Linux同步机制 - 基本概念(死锁,活锁,饿死,优先级反转,护航现象)

    死锁(deadlock) 是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去.此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进 ...

  8. Linux的原子操作与同步机制

    Linux的原子操作与同步机制   .进程1执行完“mov eax, [count]”后,寄存器eax内保存了count的值0.此时,进程2被调度执行,抢占了进程1的CPU的控制权.进程2执行“cou ...

  9. [内核同步]浅析Linux内核同步机制

    转自:http://blog.csdn.net/fzubbsc/article/details/37736683?utm_source=tuicool&utm_medium=referral ...

随机推荐

  1. VS的release工程设置为可调试

    参考:http://wineworm.blog.163.com/blog/static/29822754201111602252932/ VS2008 Release 工程调试修改方式: 1.项目—— ...

  2. 直接下载:Windows 10正式版官方原版镜像!

    本文搜集整理微软官方发布的Windows 10正式版镜像下载链接,从RTM原始正式版开始,按照时间倒序排列,即越往上的越新. 注意:以下资源均来自于微软官方原版,ed2k可视为P2P下载链接.下载完成 ...

  3. fb发布打包外部资源

    将资源放在src文件夹下面即可 然后在打包那就会看到资源,勾上即可

  4. elasticSearch-DSL

    DSL: query_string match match_phrase match_phrase_prefix multi_match   simple_query_string term term ...

  5. Oracle部署安装

    1.用户有数据库服务器则不需要安装Oracle服务器端,若没有需要安装 https://jingyan.baidu.com/article/363872eccfb9266e4aa16f5d.html ...

  6. 2018SDIBT_国庆个人第二场

    A.codeforces1038A You are given a string ss of length nn, which consists only of the first kk letter ...

  7. U3D中可以直接使用GL!!!

    https://blog.csdn.net/u013172864/article/details/78860624

  8. C++17尝鲜:结构化绑定声明(Structured Binding Declaration)

    结构化绑定声明 结构化绑定声明,是指在一次声明中同时引入多个变量,同时绑定初始化表达式的各个子对象的语法形式. 结构化绑定声明使用auto来声明多个变量,所有变量都必须用中括号括起来. cv-auto ...

  9. 重建redo文件

    需求背景 由于前期安装oracle时redo文件大小或者路径规划不合理需要进行修改,以便满足性能测试要求.redo文件规划大小建议与生产环境一致. 重做日志相关数据字典 1.v$log  记录数据库中 ...

  10. ORACLE数据库 常用命令和Sql常用语句

    ORACLE 账号相关 如何获取表及权限 1.COPY表空间backup scottexp登录管理员账号system2.创建用户 create user han identified(认证) by m ...