线程的等待队列在POSIX pthread互斥锁锁定和解锁中位于何处?

pan*_*kaj 4 multithreading posix mutex pthreads condition-variable

我正在通过REMZI的并发部分,而在通过互斥体部分时,对此感到困惑:

为了避免繁忙的等待,互斥体实现采用park()/ unpark()机制(在Sun OS上),该机制将等待线程与其线程ID放入队列中。稍后,pthread_mutex_unlock()它将从队列中删除一个线程,以便调度程序可以选择该线程。同样,Futex的实现(Linux上的互斥量实现)使用相同的机制。

  1. 我仍然不清楚队列在哪里。它是在运行进程的地址空间中还是在内核内部?

  2. 我对条件变量的另一个疑问。是pthread_cond_wait()pthread_cond_signal()使用普通信号和等待方法,还是使用它们的某些变体?

Max*_*kin 5

疑点一:但是,我仍然不清楚队列实际上在哪里。它是在运行进程的地址空间中还是在内核内部的某个地方。

每个互斥锁都在内核地址空间中维护了一个关联的数据结构,在Linux中,它是futex。该数据结构具有关联的等待队列,来自不同进程的线程可以在其中排队并等待被唤醒,请参阅futex_wait内核功能

怀疑2:我对条件变量的另一个疑问是,pthread_cond_wait()和pthread_cond_signal()是否使用常规信号和等待方法,或者它们使用它的某些变体。

现代Linux不使用信号进行条件变量信令。有关更多详细信息,请参见NPTL:Linux线程的新实现。

在内核中增加了快速用户空间锁定(futex),可以完全重新实现互斥锁和其他同步机制,而无需诉诸线程间信令。反过来,通过在内核中引入抢占式调度,就可以实现futex。