我想要一些关于互斥量和信号量的说明。
我的问题是,
- 当一个线程试图进入一个被互斥锁锁定的区域时,互斥锁实际上做了什么, 一种。它等待锁被释放? 或者 b。它会进入休眠状态,直到锁被释放。在那种情况下,它如何在释放锁时再次被唤醒?
- 与 1 相同的问题,但在本例中是信号量。
- 你能给我一些关于 C 中 pthread 忙等待的代码,以及线程进入休眠而不是等待的情况吗? sleep 是被阻塞还是 sleep 是另一种忙碌的等待?
- 我想知道一些涵盖这种情况的程序,例如一些实现忙等待、阻塞等的 c 源代码。
最佳答案
当线程试图获取互斥量上的锁时,如果该互斥量已被持有,那么通常它会使用对操作系统内核的调用来指示它正在等待,然后当当前持有锁的线程解锁时互斥锁,然后它将调用操作系统内核以唤醒等待线程之一。
这同样适用于信号量,除了它仅在计数减少到零以下时才阻塞,并且线程仅在计数增加到零以上时才被唤醒。
忙等待是指您在等待某事时不会阻塞或休眠,而是在循环中反复轮询,因此处理器总是很忙,但没有做任何有用的事情。
要真正实现busy wait,需要一个原子变量,但是POSIX threads没有提供这样的东西,所以不能真正的在pthreads中写busy wait。您可以获得的最接近的是锁定互斥锁,读取标志,解锁互斥锁,如果未设置标志则循环。这会重复锁定和解锁互斥量,但不会等待数据准备就绪。在这种情况下,您应该改用条件变量。
通常,如果一个线程调用了类似usleep
的方法来在指定的时间段内暂停其自身的执行,那么您就说该线程正在休眠。这与阻塞相反,阻塞等待另一个线程提供的特定信号。
关于c - 互斥量和信号量实际上做了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9427276/