我们可以在POSIX API中使用互斥锁,如下所示:
/* acquire the mutex lock */
pthread_mutex_lock(&mutex);
/* critical section */
/* release the mutex lock */
pthread_mutex_unlock(&mutex);
POSIX API是否使等待线程进入睡眠状态?等待队列在哪里?等待队列对用户不可见吗?
答案 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
中看到实现的权利。