您的位置:首页 > 运维架构 > Linux

Linux线程同步机制的几种方法总结与对比

2014-10-28 14:46 549 查看

线程同步机制的几种方法总结与对比

需要线程同步的原因:

当有多个线程同时访问一个共享内存里面的变量时,有时会出现一个线程正在修改该变量的值,而其他的线程正在读取数据,可能就会导致错误。

实现线程同步机制的方法:

·互斥量

·读写锁

·条件变量

一. 互斥量

互斥量从本质上说就是一把锁,在访问共享资源时,对互斥量加锁,访问完成后释放锁。对互斥量加锁以后,其他任何试图对互斥量再次加锁的线程会被阻塞直至当前线程释放互斥锁。

相关函数可参考 APUE 教材。

二. 避免死锁

如果某个线程试图对同一个互斥量加锁两次,那么它将进入死锁状态,这个是比较明显的死锁产生状态。还有一些更加不明显的方式也能产生死锁。比如:程序使用多个互斥量时,如果允许 线程甲 一直占有第一个互斥量 A 并且在试图锁住第二个互斥量 B 时处于阻塞状态,但是拥有第二个互斥量 B 的线程 乙 也在试图锁住第一个互斥量 A 。这时就会发生死锁。

解决方法:可用过小心的控制互斥量加锁顺序来避免死锁。

运用数据结构解决。

三. 读写锁

读写锁和互斥量类似,区别在于:互斥量只有两个状态,即锁住状态和不加锁状态,而且一次只有一个线程可以对其加锁。而读写锁可以有三个状态,读模式下加锁状态,写模式下加锁状态,不加锁状态。一次只能有一个线程占有写模式的读写锁,但可以由多个线程同时占有读模式的读写锁。

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

相关函数可参考 APUE 教材。

四. 条件变量

条件变量使我们可以睡眠等待某种条件出现。

条件变量是利用线程间共享的全局变量进行同步的一种机制,主要包括两个动作:一个线程等待"条件变量的条件成立"而挂起;另一个线程使"条件成立"(给出条件成立信号)。为了防止竞争,条件变量的使用总是和一个互斥锁结合在一起。

相关函数可参考 APUE 教材。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: