博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Linux 多线程同步机制:互斥量、信号量、条件变量
阅读量:6571 次
发布时间:2019-06-24

本文共 1327 字,大约阅读时间需要 4 分钟。

互斥量:互斥量提供对共享资源的保护访问,它的两种状态:lock和unlock,用来保证某段时间内只有一个线程使用共享资源,互斥量的数据类型是pthread_mutex_t

主要涉及函数:pthread_mutex_lock() pthread_mutex_trylock() pthread_mutex_unlock()
Pthreaf_mutex_init() pthread_mutex_destroy()
lock与unlock之间所锁定的区域为临界区域(如果只加锁不解锁程序会阻塞等待)
信号量:信号量是一个特殊的整数值,主要用来控制多个线程(进程)对临界资源的互斥访问,线程根据信号量来判断是否有访问的资源,信号量是一种线程同步机制,信号量与信号不同。
信号量是一个计数器,可用于同步多线程对共享数据对象得访问,为了获得共享资源,线程需要执行以下操作:
1、测试控制该资源的信号量
2、若此信号量的值为正,则线程可以使用该资源,线程将信号量值减1,表示它使用了一个资源单位
3、若此信号量的值为0,则线程进入睡眠状态,直至信号量值大于0。当线程被唤醒后,它返回至第1步。
条件变量: 只用互斥量很可能会引起死锁,为此引入了条件变量,条件变量允许线程阻塞和等待另一个线程发送的信号,使用条件变量可以以原子方式阻塞线程,直到满足某个条件为止,可以避免忙等。
条件变量常和互斥锁一起使用,互斥量主要用来保证对临界区的互斥进入,而条件变量则用于线程的阻塞等待,互斥锁定进入临界区以后,若条件不满足,线程便转为等待状态,等待条件满足后被唤醒执行,否则继续执行,执行完后开锁
条件变量的数据类型是pthread_cond_t
主要涉及函数:pthread_cond_init() pthread_cond_signal() pthread_cond_wait()
Pthread_cond_timewait() pthread_cond_broadcast()
Pthread_cond_wait()函数作用:
1.先对传入的互斥量mutex解锁(自动释放即解锁)
2.再wait阻塞等待(阻塞被别的线程的pthread_cond_singal()唤醒后必须先加锁再执行)

读写锁rwlock:

分为:rdlock(读锁):只要没有线程持有某个给定的读写锁用于写,那么任意数目的线程可以持有该读写锁用于读,共享锁
wrlock(写锁):仅当没有线程持有某个给定的读写锁用于读或者写时,才能分配该读写锁用于写,独占锁
pthread_rwlock_t rwlock=PTHREAD_RWLOCK_INITIALIZER;(初始化读写锁)
pthread_rwlock_rdlock(&rwlock):分配读锁
pthread_rwlock_wrlock(&rwlock):分配写锁
pthread_rwlock_unlock(&rwlock):解锁(只有解读写锁)

写锁解锁后多个线程在同等条件下分配读锁和写锁时先分配写锁(优先考虑分配写锁,但这不是必须的(系统不同))

转载于:https://blog.51cto.com/13665347/2095435

你可能感兴趣的文章
区块链以及区块链技术入门详解
查看>>
学界 | 伯克利最新研究:用算法解决算法偏差?公平机器学习的延迟影响
查看>>
JSP自定义标签
查看>>
php-unlink() 函数
查看>>
mysql之 double write 浅析
查看>>
大数据产业发展的国际经验
查看>>
jQuery+Ajax+PHP无刷新分页
查看>>
多文件上传示例源码(默认支持各种类型,包括图片)
查看>>
正向代理和反向代理
查看>>
采用私有云、公有云还是混合云 —— 先解决四个关键问题
查看>>
ORACLE将执行过的SQL语句存放在内存的共享池
查看>>
php 扩展之oci8在ThinkPHP上的应用
查看>>
vsftp的默认目录那点事
查看>>
JavaScript中的判定
查看>>
NIOS2随笔——BMP解码与VGA显示
查看>>
#6 shell脚本见解与编程
查看>>
OpenGL ES的函数解析和记录理解
查看>>
SourceTree 的初次使用的两个小问题
查看>>
27.2. C++ library
查看>>
7.5. nload: Console application which monitors network traffic and bandwidth
查看>>