多线程信号量,互斥锁,条件变量异同

来源:互联网 发布:引起妹子的兴趣知乎 编辑:程序博客网 时间: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上,那么此条件变量上的信号丢失。

阅读全文
0 0
原创粉丝点击