当'pthread_mutex_trylock`存在时,为什么需要`pthread_mutex_lock`?

时间:2012-02-13 08:28:08

标签: pthreads mutex

pthread_mutex_trylock检测到死锁,没有阻止,那么为什么你甚至“需要” pthread_mutex_lock

也许当你故意要线程阻止?但在这种情况下,它可能导致死锁?

2 个答案:

答案 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_lockpthread_mutex_trylock的主要原因。

答案 1 :(得分:1)

  

也许当你故意要线程阻止时?

是的,完全是在这种情况下。但你可以用类似的东西模仿pthread_mutex_lock()行为

while(pthread_mutex_trylock(&mtx))
  pthread_yield()