等待中的 pthread_mutex 可能会遇到哪些威胁?
What are the possible threats that a waiting pthread_mutex might encounter?
如果 pthread 正在锁定共享资源。
等待中的 pthread_mutex 是否会遇到任何威胁?
类似并行线程的限制、时间限制、事件...
正如您在规范中看到的,例如 here,pthread_mutex_lock()
有一个 int return 值。除了 trivial/obvious 错误原因,例如 "invalid argument" 等,还有一个实际上可以被认为是 "threat"。尤其是对不检查 return 值的人的威胁。
此威胁是 return 值 EAGAIN
,如果未正确捕获它,可能会导致您的程序出错,访问互斥锁本应保护的资源,但它没有获取互斥锁。 EAGAIN
可能会发生,例如,如果进程接收到 System V "signal" 并且包含代码的线程受其影响。
一般来说,使用与 Posix 线程并行的 Unix System V 构造(例如信号)至少是危险的。在 Unix System V 中,线程不存在,很明显进程的单个主线程是 "interrupted" 并用于处理信号(使用堆栈切换到信号堆栈)。主线程的任何内核端阻塞都被中断,阻塞函数 returns 与 EAGAIN
并且必须在处理信号后重新发出其调用。
因此,不幸的是,在 Posix/Unix 系统上编码的唯一万无一失的方法涉及大量 while 循环围绕任何可能阻塞的东西。
while( EAGAIN == pthread_mutex_lock(...) );
不这样做意味着您的代码只能用于明确完全控制信号行为的应用程序。比如禁用所有信号或者使用其他手段保证执行这段代码的线程不会受到影响。
除此之外,互斥量是系统资源(内核对象),可用量不是无限的,但通常不需要担心。我希望其他答案能够详细说明这些限制。
EDIT 文档似乎在过去几年发生了变化。现在他们声明,EAGAIN 将与递归锁的限制相关,并且 EINTR
不会发生。以前至少有systems/documentations符合我上面的解释
也是新的(至少对我而言):
If a signal is delivered to a thread waiting for a mutex, upon return from the signal handler the thread shall resume waiting for the mutex as if it was not interrupted.
好吧,自从我上次被迫使用此类系统以来,他们可能学到了一些东西。
如果 pthread 正在锁定共享资源。
等待中的 pthread_mutex 是否会遇到任何威胁?
类似并行线程的限制、时间限制、事件...
正如您在规范中看到的,例如 here,pthread_mutex_lock()
有一个 int return 值。除了 trivial/obvious 错误原因,例如 "invalid argument" 等,还有一个实际上可以被认为是 "threat"。尤其是对不检查 return 值的人的威胁。
此威胁是 return 值 EAGAIN
,如果未正确捕获它,可能会导致您的程序出错,访问互斥锁本应保护的资源,但它没有获取互斥锁。 EAGAIN
可能会发生,例如,如果进程接收到 System V "signal" 并且包含代码的线程受其影响。
一般来说,使用与 Posix 线程并行的 Unix System V 构造(例如信号)至少是危险的。在 Unix System V 中,线程不存在,很明显进程的单个主线程是 "interrupted" 并用于处理信号(使用堆栈切换到信号堆栈)。主线程的任何内核端阻塞都被中断,阻塞函数 returns 与 EAGAIN
并且必须在处理信号后重新发出其调用。
因此,不幸的是,在 Posix/Unix 系统上编码的唯一万无一失的方法涉及大量 while 循环围绕任何可能阻塞的东西。
while( EAGAIN == pthread_mutex_lock(...) );
不这样做意味着您的代码只能用于明确完全控制信号行为的应用程序。比如禁用所有信号或者使用其他手段保证执行这段代码的线程不会受到影响。
除此之外,互斥量是系统资源(内核对象),可用量不是无限的,但通常不需要担心。我希望其他答案能够详细说明这些限制。
EDIT 文档似乎在过去几年发生了变化。现在他们声明,EAGAIN 将与递归锁的限制相关,并且 EINTR
不会发生。以前至少有systems/documentations符合我上面的解释
也是新的(至少对我而言):
If a signal is delivered to a thread waiting for a mutex, upon return from the signal handler the thread shall resume waiting for the mutex as if it was not interrupted.
好吧,自从我上次被迫使用此类系统以来,他们可能学到了一些东西。