程序员的自我修养-线程安全

来源:互联网 发布:头上粉色爱心 软件 编辑:程序博客网 时间:2024/06/02 22:02

线程安全

同步与锁

  • 二元信号量:只有两种形态,占用和非占用。
  • 信号量:对于允许多个线程并发访问的资源,多元信号量是一个很好的选择。它会进行如下操作:

    • 如果信号量的值小于0,则进入等待状态,负责继续进行。
    • 将信号量的值减1;
      访问完资源后,线程释放信号量,进行如下操作:
    • 将信号量的值加1;
    • 如果信号量的值小于1,唤醒一个等待中的线程。
  • 互斥量:和二元信号量很类似,但和信号量不同的是,信号量在整个系统可以被任意线程获取并释放,也就是说同一个信号量可以被系统中的一个线程获取之后由另一个线程释放。而互斥量则要求哪个线程获取了互斥量,哪个线程就要负责释放这个锁。

  • 临界区:比互斥量更严格。临界区与互斥量和信号量的区别在于,互斥量和信号量在系统任何进程里都是可见的。而临界区的作用范围仅限于本进程。注意是进程
  • 读写锁:多个线程同时读取是没有问题的,但只要有一个线程试图对数据进行修改,就必须使用同步手段避免出错。如果我们用上述任何一种进行同步,尽管可以保证程序正确,但对于频繁读取,偶尔写入的情况会显得非常低效。读写锁可以避免这个问题。
  • 条件变量

过度优化

volatile试图阻止过度优化

0 0