pthread_mutex_trylock检测死锁,不阻塞,那为什么你甚至"需要" pthread_mutex_lock?
也许当你故意想让线程阻塞?但在这种情况下,它可能导致死锁?
pthread_mutex_trylock也不会检测死锁.
您可以使用它来避免死锁,但是您必须通过在其周围包装自己的代码来实现这一点,有效地pthread_mutex_trylock在具有超时的循环中进行多次调用,之后您的线程将释放其所有资源.
在任何情况下,即使pthread_mutex_lock您遵循所有线程以相同顺序分配资源的简单规则,您也可以避免死锁.
您可以使用pthread_mutex_lock,如果你只是想有效地等到资源可用,而无需旋转互斥,这东西往往是非常低效的.正确设计的多线程应用程序不需要pthread_mutex_trylock变体.
锁只能在绝对最短时间内保持工作,如果时间过长,通常可以重新设计锁定时间较少(例如通过使用互斥锁将数据复制到线程的本地数据区域,并且在释放互斥锁之后具有长时间运行的位.)
伪代码:
while not pthread_mutex_trylock:
yield
Run Code Online (Sandbox Code Playgroud)
将继续运行你的线程,等待锁可用,特别是因为pthread_yield()POSIX线程中没有(尽管它有时作为非可移植扩展提供).
这意味着,在最坏的情况下,上面的代码段甚至不能兼容地产生CPU,因此每次通过调度程序周期都会咀嚼其余的量程.
最好的情况是,它仍然会在每个调度程序周期中激活一次线程,以查看是否可以获取互斥锁.
鉴于:
pthread_mutex_lock
Run Code Online (Sandbox Code Playgroud)
很可能完全暂停你的线程,直到锁定可用,因为它会将它移动到等待队列,直到当前锁定持有者释放互斥锁.
这可能是主要的原因,你应该更喜欢pthread_mutex_lock到pthread_mutex_trylock.
| 归档时间: |
|
| 查看次数: |
3849 次 |
| 最近记录: |