c - 互斥量和信号量实际上做了什么?

标签 c multithreading pthreads mutex semaphore

我想要一些关于互斥量和信号量的说明。
我的问题是,

  1. 当一个线程试图进入一个被互斥锁锁定的区域时,互斥锁实际上做了什么, 一种。它等待锁被释放? 或者 b。它会进入休眠状态,直到锁被释放。在那种情况下,它如何在释放锁时再次被唤醒?
  2. 与 1 相同的问题,但在本例中是信号量。
  3. 你能给我一些关于 C 中 pthread 忙等待的代码,以及线程进入休眠而不是等待的情况吗? sleep 是被阻塞还是 sleep 是另一种忙碌的等待?
  4. 我想知道一些涵盖这种情况的程序,例如一些实现忙等待、阻塞等的 c 源代码。

最佳答案

当线程试图获取互斥量上的锁时,如果该互斥量已被持有,那么通常它会使用对操作系统内核的调用来指示它正在等待,然后当当前持有锁的线程解锁时互斥锁,然后它将调用操作系统内核以唤醒等待线程之一。

这同样适用于信号量,除了它仅在计数减少到零以下时才阻塞,并且线程仅在计数增加到零以上时才被唤醒。

忙等待是指您在等待某事时不会阻塞或休眠,而是在循环中反复轮询,因此处理器总是很忙,但没有做任何有用的事情。

要真正实现busy wait,需要一个原子变量,但是POSIX threads没有提供这样的东西,所以不能真正的在pthreads中写busy wait。您可以获得的最接近的是锁定互斥锁,读取标志,解锁互斥锁,如果未设置标志则循环。这会重复锁定和解锁互斥量,但不会等待数据准备就绪。在这种情况下,您应该改用条件变量。

通常,如果一个线程调用了类似usleep 的方法来在指定的时间段内暂停其自身的执行,那么您就说该线程正在休眠。这与阻塞相反,阻塞等待另一个线程提供的特定信号。

关于c - 互斥量和信号量实际上做了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9427276/

相关文章:

使用 while 的 C 程序 - 如果 counter>8 则出现奇怪的计数器错误

c++ - 如何在 Linux 上查看(C 和 C++)二进制符号?

c - Pthreads 在执行时更新全局 2D 数组段错误

c - 对于缓冲区溢出,使用pthreads时栈地址是多少?

c++ - 为什么每次执行时函数的地址都不同?

c - 在 Excel 与记事本中打开 csv 文件

c# - 从 Timer 内的 ListBox 中删除

java - 如何搁浅 executorservice

c# - 快速 C# 线程类

c - 以循环方法调度 pthread