linux mutex互斥体和semaphore信号量的区别

2025-02-02 10:58:31
推荐回答(2个)
回答1:

mutex互斥体只用于保护临界区的代码(访问共享资源),而不用于锁之间的同步,即一个线程释放mutex锁后,马上又可能获取同一个锁,而不管其它正在等待该mutex锁的其它线程。
semaphore信号量除了起到保护临界区的作用外,还用于锁同步的功能,即一个线程释放semaphore后,会保证正在等待该semaphore的线程优先执行,而不会马上在获取同一个semaphore。
如果两个线程想通过一个锁达到输出1,2,1,2,1,2这样的序列,应使用semaphore, 而使用mutex的结果可能为1,1,1,1,1,2,2,2,111.....。

回答2:

  1. mutex保护的资源在同一时刻只允许一个task进行访问;semaphore根据初始值n可以允许至多n个task访问。

  2. semaphore可以实现“等待”机制,一种常见的场景是task0进入阻塞状态“等待”某个事件发生,task1触发事件后“唤醒”task0。task0在“等待”时处于阻塞状态而不是运行状态,因此不会浪费CPU时间。而一个task在拿到mutex之后释放之前不宜进行太长时间的操作,更不能阻塞。