多线程信号量,互斥锁,条件变量异同
来源:互联网 发布:引起妹子的兴趣知乎 编辑:程序博客网 时间:2024/05/29 15:27
只是阐述相关性,具体代码逻辑,网上一抓一大片,在此不在详述。
1、信号量:
主要用于线程之间的数据同步,比如A线程数据处理完成之后会立马通知B线程进行相应的操作。常见的信号有两种一种是二进制信号,只有0和1两种状态,这种情况下类似于互斥锁,另一种就是整型信号,在不为0的情况下则可以获取到信号,进行操作,每次操作完则进行信号减1,直到为0的时候才会处于阻塞。信号量在使用的时候,需要注意的是,要确保A线程与B线程直接的信号同步情况,比如A线程处理完成某一操作之后,通知到B线程,则B线程开始处理,如果A继续进行处理,则此时的信号量一直将处于增长的状态,而B线程无法感知此种情况,该种情况下组要使用两个信号量,在B情况处理完成之后,通知A线程(信号量B),而A线程在处理完成之后也会通知B线程(信号量A),但是在初始化的时候,一般是把B信号初始化成1,在A线程优先使用,具体原因,可自己思考。信号量可以用在进程间或线程间(linux仅线程间的无名信号量pthread semaphore)进行通信,而互斥锁主要是用在线程间
2、互斥锁:
互斥锁主要是在线程之间对于同一资源互斥使用时候的操作,主要用在互斥上,比如在A线程使用的时候,则B线程将会处于阻塞状态下,只有在A线程释放掉锁之后,B线程才能使用锁。注意跟信号量的区别,信号量是在A线程完成数据操作之后,会主动通知到B线程或者其他线程,而互斥锁则不会进行通知,只有在其他线程使用到该全局变量的时候,才会判断是否处于加锁的情况下,如果没有则加锁,如果有则处于阻塞模式。互斥锁必须总是由给他上锁的线程解锁(因为此时其他线程根本得不到此锁),信号量没有这种限制:一个线程等待某个信号量,而另一个线程可以挂出该信号量
3、条件变量:
条件变量类似于信号量,一旦条件“成熟”则进行处理,条件变量能使线程处于wait状态,另一个线程在满足条件的时候发signal,然后所有处于wait的线程依次得到唤醒,条件变量通过线程阻塞和可以给另一个线程发送signal唤醒线程的优厚条件弥补了互斥锁只有加锁和解锁的这两种情况,在一般情况下,条件变量和互斥锁是联合使用的,在条件成熟的情况下,加锁,处理数据,释放锁,再次等待条件成熟。它是发送信号与等待信号。互斥锁用户上锁,条件变量则用于等待。一般来说,在一个进程/线程中调用pthread_cond_wait(..)等待某个条件的成立,此时该进程阻塞在这里,另外一个进程/线程进行某种操作,当某种条件成立时,调用pthread_cond_signal(...)来发送信号,从而使pthread_cond_wait(...)返回。此处要注意的是,这里所谈到的信号,不是系统级别的SIGXXXX信号,只是用信号这个词语更容易理解。条件变量与信号量更接近或者就可以认为是信号量。pthread_cond_wait函数也可以用一个while死循环来等待条件的成立,但要注意的是,使用while死循环会严重消耗CPU,而pthread_cond_wait则是采用线程睡眠的方式,它是一种等待模式,而不是一直的检查模式。每个信号量有一个与之关联的值,挂出时+1,等待时-1,那么任何线程都可以挂出一个信号,即使没有线程在等待该信号量的值。不过对于条件变量来说,如果pthread_cond_signal之后没有任何线程阻塞在pthread_cond_wait上,那么此条件变量上的信号丢失。
- 多线程信号量,互斥锁,条件变量异同
- 多线程同步(信号量,互斥锁,条件变量)
- 互斥锁、条件变量、信号量
- 互斥锁 条件变量 信号量
- 互斥锁、条件变量、信号量
- 信号量,互斥锁,条件变量
- 互斥锁、条件变量、信号量
- 多线程(互斥锁、读写锁、条件变量、信号量、自旋锁)相关
- 多线程(互斥锁、读写锁、条件变量、信号量、自旋锁)相关
- 互斥锁-条件变量-信号量总结
- linux网络编程二十七:多线程编程之信号量、互斥锁和条件变量
- Linux系统下的多线程编程-条件变量&信号量
- Java多线程开发六——锁、条件变量、信号量
- 多线程 - 使用Mutex和条件变量实现信号量
- linux多线程编程--信号量和条件变量 唤醒丢失事件
- Linux系统下的多线程编程-条件变量&信号量
- linux多线程编程--信号量和条件变量 唤醒丢失事件
- Linux下多线程同步方式之互斥量,信号量,条件变量
- thinkphp5 笔记第二天 重点 curl phpmailer
- easyui 常用控件禁用方法
- AbstractQueuedSynchronizer整体解析
- 请实现一个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。
- 转载-深入学习:Windows下Git入门教程(下)
- 多线程信号量,互斥锁,条件变量异同
- 关于比特币
- VisualBasic的历史
- POJ 3617 字典序贪心
- bochs和gdb联合使用调试程序_开始
- CSS(十)
- Hibernate JPA
- 您的计算机剩余空间不足,程序无法自动诊断问题并向开发者发送问题
- shell中字符提取命令awk和cut的不同