pthread_mutex_trylock
检测到死锁,没有阻止,那么为什么你甚至“需要” pthread_mutex_lock
?
也许当你故意要线程阻止?但在这种情况下,它可能导致死锁?
答案 0 :(得分:6)
pthread_mutex_trylock
不检测到死锁。
您可以使用它来避免死锁,但是您必须通过将自己的代码包装在其周围来实现这一点,有效地在循环中多次调用pthread_mutex_trylock
并超时你的线程释放所有资源。
在任何情况下,如果只遵循所有线程以相同顺序分配资源的简单规则,即使使用pthread_mutex_lock
,也可以避免死锁。
如果您只想有效地等待资源可用,则可以使用pthread_mutex_lock
,而无需在互斥锁上旋转,这通常效率非常低。正确设计的多线程应用程序不需要pthread_mutex_trylock
变体。
锁定只能在绝对最短的时间内完成工作,如果时间过长,通常可以重新设计锁定时间(例如通过使用互斥锁将数据复制到线程的本地)数据区域,并且在互斥体释放后具有长时间运行的位。)
伪代码:
while not pthread_mutex_trylock:
yield
将继续运行您的线程,等待锁定可用,尤其是,因为POSIX线程中没有pthread_yield()
(尽管它有时作为非可移植扩展提供)
这意味着,在最坏的情况下,上面的代码段甚至无法以可移植的方式产生CPU,因此每次通过调度程序周期都会咀嚼其余的量程。
充其量,它仍会在每个调度程序周期激活一次线程,以查看是否可以获取互斥锁。
鉴于:
pthread_mutex_lock
很可能完全暂停您的线程,直到锁定可用,因为它会将其移动到等待队列,直到当前锁定持有者释放互斥锁。
这可能是您偏好pthread_mutex_lock
到pthread_mutex_trylock
的主要原因。
答案 1 :(得分:1)
也许当你故意要线程阻止时?
是的,完全是在这种情况下。但你可以用类似的东西模仿pthread_mutex_lock()
行为
while(pthread_mutex_trylock(&mtx))
pthread_yield()