我们什么时候应该使用互斥锁,什么时候应该使用信号量?
原文由 Karthik Balaguru 发布,翻译遵循 CC BY-SA 4.0 许可协议
我们什么时候应该使用互斥锁,什么时候应该使用信号量?
原文由 Karthik Balaguru 发布,翻译遵循 CC BY-SA 4.0 许可协议
7 回答5.3k 阅读
4 回答4k 阅读
2 回答5.9k 阅读✓ 已解决
2 回答2.5k 阅读✓ 已解决
1 回答2.3k 阅读✓ 已解决
2 回答800 阅读✓ 已解决
2 回答3.2k 阅读
以下是我记得什么时候使用什么 -
信号量: 当你(线程)想睡觉时使用信号量,直到其他线程告诉你醒来。信号量“向下”发生在一个线程(生产者)中,信号量“向上”(对于相同的信号量)发生在另一个线程(消费者)中,例如:在生产者-消费者问题中,生产者想要休眠直到至少一个缓冲区为空 - 仅消费者线程可以判断缓冲区插槽何时为空。
互斥锁: 当您(线程)想要执行不应由任何其他线程同时执行的代码时,请使用互斥锁。互斥锁“向下”发生在一个线程中,而互斥锁“向上” 必须 稍后发生在同一个线程中。例如:如果您要从全局链表中删除一个节点,您不希望另一个线程在您删除该节点时使用指针乱七八糟。当您获取一个互斥锁并忙于删除一个节点时,如果另一个线程试图获取相同的互斥锁,它将进入睡眠状态,直到您释放该互斥锁。
自旋锁 : 当您确实想使用互斥锁但不允许您的线程休眠时,请使用自旋锁。例如:操作系统内核中的中断处理程序绝不能休眠。如果是这样,系统将冻结/崩溃。如果需要从中断处理程序中插入一个节点到全局共享链表,获取一个自旋锁-插入节点-释放自旋锁。