信号量(Semaphore)和互斥锁(Mutex)的异同

对于线程来说,信号量跟互斥锁是非常重要的概念,可以避免死锁或者读脏数据,然而两者区别也需要我们注意。

对于互斥锁(Mutex)来说,只要有线程占有了该资源,那么不好意思,其他线程就是优先级再高,您也得等着,等我用完再说。我用完之后资源你们爱怎么抢都行,我占有资源的时候别人都不许抢,申请该资源的线程一律等待。

信号量(Semaphore)就更灵活一点,我们如果想把我用完的资源给我关系好的人,就申请一个信号量,这个信号量只有我们几个知道,我用完资源就偷偷通知关系好的这几个,这几个哥们再有序申请资源,别的人干瞪眼。

下面严肃解释一下:

互斥锁(Mutex)保证了使用资源线程的唯一性和排他性,但是无法限制资源释放后其他线程申请的顺序问题,所以是无序的。

而信号量(Semaphore)一般就是互斥的(少许情况读取是可以同时申请的),其保证了线程执行的有序性,可以理解为从一到多的进步,像比较有名的理发厅问题,我们就需要设一个Integer而非Boolean,因为理发厅里面的座椅不可能只有一张。

互斥锁必须由单个线程获取和释放。

信号量是由单个线程释放,另一个线程获取,保证线程同步。

信号量是互斥的进步,Semaphore=1时可以看成互斥锁。

算法设计时注意事项:

找到多个线程都会申请的资源,设定缓冲区或者直接加锁。

是否需要线程通信。

线程同步有耗时长、需要反馈等特点,是否必须使用信号量。

力量的代价2333。

 

 

猜你喜欢

转载自blog.csdn.net/qq_40568075/article/details/81387379