线程同步

来源:互联网 发布:新浪博客怎么seo 编辑:程序博客网 时间:2024/05/29 13:07

当多个控制线程共享相同的内存时,当一个线程可以修改的变量,其他线程也可以读取该变量或者修改时,就需要对这些线程进行同步,确保它们在访问变量的存储内容时不会访问到无效的值。

互斥量

互斥量(mutex)从本质上说是一把锁,在访问共享资源前对互斥量进行设置(加锁),在访问完成后释放(解锁)互斥量。

避免死锁

如果线程试图对同一个互斥量加锁两次,那么它自身就会陷入死锁状态;或者两个线程都在相互请求另一个线程拥有的资源,所以这两个线程都无法向前运行,于是就产生死锁。

可以通过仔细控制互斥量加锁的顺序来避免死锁的产生。

读写锁

读写锁(reader-writer lock)与互斥锁类似,不过读写锁允许更高的并行性。

互斥锁只有两种状态(锁与不锁),而且一次只有一个线程可以对其加锁。

读写锁可以有3种状态:

  • 读模式下加锁状态
  • 写模式下加锁状态
  • 不加锁状态

一次只有一个线程可以占有写模式的读写锁,但是多个线程可以同时占有读模式的读写锁。

读写锁适用于对数据结构读的次数远大于写的情况。

条件变量

条件变量是与互斥量一起使用的,允许线程以无竞争的方式等待特定的条件发生。它可以阻塞一个或同时阻塞多个线程直到:

  • 收到来自其他线程的通知
  • 超时
  • 发生虚假唤醒(Spurious Wakeup)

自旋锁

自旋锁与互斥量类似,但它不是通过休眠使进程阻塞,而是在获取锁之前一直处于忙等(自旋)阻塞状态。自旋锁可用于锁被持有的时间短,而且线程不希望在重新调度上花费太多的成本。

屏障

屏障是用户协调多个线程并行工作的同步机制。屏障允许每个线程等待,直到所有的合作线程都到达某一点,然后从该点继续执行。

0 0
原创粉丝点击