Linux kernel 互斥锁是否在POSIXAPI中使等待线程休眠?

Linux kernel 互斥锁是否在POSIXAPI中使等待线程休眠?,linux-kernel,synchronization,pthreads,posix,mutex,Linux Kernel,Synchronization,Pthreads,Posix,Mutex,我们可以在POSIX API中使用互斥锁,如下所示: /*获取互斥锁*/ pthread_mutex_lock(&mutex); /*临界截面*/ /*释放互斥锁*/ pthread_mutex_unlock(&mutex); POSIXAPI是否使等待的线程进入睡眠状态?等候的队伍在哪里?等待队列是否对用户不可见 POSIXAPI是否使等待的线程进入睡眠状态 POSIXAPI只是一个API,可以用不同的方式实现 在Linux中,POSIX线程库用于实现互斥。当一个互斥锁被争用时,pthrea

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

/*获取互斥锁*/
pthread_mutex_lock(&mutex);
/*临界截面*/
/*释放互斥锁*/
pthread_mutex_unlock(&mutex);
POSIXAPI是否使等待的线程进入睡眠状态?等候的队伍在哪里?等待队列是否对用户不可见

POSIXAPI是否使等待的线程进入睡眠状态

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

在Linux中,POSIX线程库用于实现互斥。当一个互斥锁被争用时,pthread实现将使用syscall请求内核的干预,从而根据需要使线程进入睡眠或唤醒状态。因此,,调用
pthread\u mutex\u lock()

需要注意的一点是,正如维基百科的文章所指出的,一个正确编程的基于futex的锁不会使用系统调用,除非该锁被争用。POSIX线程库就是这种情况,因此您可以使用从不发出
futex(2)
syscalls的线程来实现功能完善和同步化的程序

等候的队伍在哪里?等待队列是否对用户不可见


由于互斥体是基于futex的,futex争用最终由内核处理,因此等待队列驻留在内核空间,从用户空间看不到。您可以在Linux内核源代码的文件中看到正确的实现。

通常,Linux下的POSIX互斥体是futex支持的。队列在内核中。条件变量可能在用户内存中有队列,但POSIX下没有API访问它。