线程的并发所引起的问题

版权声明:本文为博主原创文章,欢迎转载,请尊重原创,转载注明链接。 https://blog.csdn.net/qqliyunpeng/article/details/52422435

1. 并发和竞态:

并发:多个执行单元同时、并行被执行
竞态:当并发的执行单元对共享资源访问时会引起静态

还有一个概念:
临界区:访问的共享资源的代码区域

如何判断是不是会有竞态记住这句话:
只要并发的多个执行单元存在对共享资源的访问,竞态就有可能发生

2. 在linux中,主要的竞态发生在如下的3种情况:

  1. SMP(对称多处理器) 的多个 CPU
    SMP 的特点就是多个 CPU,系统总线只有一套。
  2. 单 CPU 内进程和抢占它的进程
    linux 2.6 内核之后支持抢占调度。
    抢占调度指的是 一个进程在内核执行的时候可能被另一高优先级进程打断,
    进程与抢占它的进程访问共享资源的情况类似于 SMP 的多个 CPU
  3. 中断(硬中断、软中断、Tasklet、底半部) 与进程之间
    中断可以打断正在执行的进程,如果中断处理程序访问进程正在访问的资源,则竞态也会发生。

解决竞态问题的途径是保证对共享资源的互斥访问
在linux驱动中可采取的互斥途径:

  • 中断屏蔽
  • 原子操作
  • 自旋锁
  • 信号量

3. 优缺点:

项\类型 等待方式 控制区域 请求资源速度 常用在的函数
自旋锁 忙等待(在内核的运行态) 不能调用可能引起进程调度的函数不能调用睡眠函数要求短平快 相对较快 中断处理函数
信号量 睡眠等待(在睡眠态) 无限制 相对较慢 普通函数
展开阅读全文

没有更多推荐了,返回首页