互斥锁是否会使等待线程在POSIX API中进入睡眠状态?

时间:2020-02-02 14:17:34

标签: linux-kernel synchronization pthreads posix mutex

我们可以在POSIX API中使用互斥锁,如下所示:

/* acquire the mutex lock */
pthread_mutex_lock(&mutex);
/* critical section */
/* release the mutex lock */
pthread_mutex_unlock(&mutex);

POSIX API是否使等待线程进入睡眠状态?等待队列在哪里?等待队列对用户不可见吗?

1 个答案:

答案 0 :(得分:2)

POSIX API是否使等待线程进入睡眠状态?

POSIX API只是一个 API ,可以用不同的方式实现。

在Linux中,POSIX线程库使用futexes来实现互斥体。在争用互斥锁时,pthread实现将使用futex(2) syscall来请求内核的干预,该干预将使睡眠或根据需要唤醒线程。因此,,在调用pthread_mutex_lock()时,线程肯定可以进入睡眠状态。

正如Wikipedia文章所建议的,要注意的一件事是:正确编程的基于futex的锁不使用系统调用,除非有竞争。 POSIX线程库就是这种情况,因此您可能会使用从不发出futex(2)系统调用的线程来完美运行并同步程序。

等待队列在哪里?等待队列对用户不可见吗?

由于互斥体基于futex,并且futex争用最终由内核处理,因此等待队列位于内核空间中,并且在用户空间中不可见。您可以在Linux内核源代码的文件kernel/futex.c中看到实现的权利。

相关问题