gpt4 book ai didi

multithreading - POSIX pthread 互斥锁和解锁中线程的等待队列在哪里?

转载 作者:行者123 更新时间:2023-12-04 08:27:10 24 4
gpt4 key购买 nike

我正在查看来自 REMZI 的并发部分在浏览互斥锁部分时,我对此感到困惑:

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

  • 我仍然不清楚队列在哪里。它是在正在运行的进程的地址空间中还是在内核内部的某个地方?
  • 我的另一个疑问是关于条件变量。做 pthread_cond_wait()pthread_cond_signal()正常使用 signals和等待方法,还是他们使用它的一些变体?
  • 最佳答案

    Doubt 1: But, it is still unclear to me where actually does the queue lies. Is it in the address space of the running process or somewhere inside kernel.



    每个互斥体都有一个关联的数据结构维护在内核地址空间中,在 Linux 中它是 futex .该数据结构有一个关联的等待队列,来自不同进程的线程可以在其中排队等待被唤醒,参见 futex_wait kernel function .

    Doubt 2: Another doubt I had is regarding condition variables, does pthread_cond_wait() and pthread_cond_signal() use normal signal and wait methods OR they use some variant of it.



    现代 Linux 不将信号用于条件变量信号。见 NPTL: The New Implementation of Threads for Linux更多细节:

    The addition of the Fast Userspace Locking (futex) into the kernel enabled a complete reimplementation of mutexes and other synchronization mechanisms without resorting to interthread signaling. The futex, in turn, was made possible by the introduction of preemptive scheduling to the kernel.

    关于multithreading - POSIX pthread 互斥锁和解锁中线程的等待队列在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25419225/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com