源码解析

threading.py 中 Lock 的定义如下:

接下来,进入到 Python 的源代码,查看 thread 模块的源码(Modules/threadmodule.c):

可见创建锁用的是 PyThread_allocate_lock(),该函数是 Python/thread.c 提供的,而 Python/thread.c 只是一个入口文件,不同操作系统的线程实现被放到了不同的文件中,比如操作系统 foobar 的实现在 Python/thread_foobar.h 文件中,Python/thread.c 根据配置决定包含哪个文件。接下来分析 POSIX 系统的实现(Python/thread_pthread.h):

Python 中使用的是匿名信号量,下面将简单介绍 POSIX 的匿名信号量。


POSIX 信号量

信号量是一种用于在不同进程间或同一进程内的不同线程间进行同步的工具。

POSIX 提供两类信号量:有名(named)信号量和基于内存的(memory-based)信号量,后者也被称为无名(unnamed)信号量。

POSIX 信号量有三种操作:

POSIX 信号量的函数接口如下图所示:

sem.bmp

sem_trywait() 和 sem_wait() 的差别是:当信号量的值等于0时,该函数直接 EAGAIN 错误,调用线程不会被阻塞。


参考文档