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

Aqu*_*irl 2 mutex pthreads

pthread_mutex_trylock检测死锁,不阻塞,那为什么你甚至"需要" pthread_mutex_lock

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

pax*_*blo 6

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_lockpthread_mutex_trylock.

  • Anisha,我的意思是几乎不需要轮询互斥锁,因为如果你不能得到它,你就无法做你想做的事.人们经常进行轮询,以便他们可以在线程中做其他工作,直到互斥锁可用,但这样做会破坏线程的整个目的.如果你在等待期间想要发生其他事情,那么这就是_another_线程的用途.用Yoda的话来说,"线程.或者不是线程.没有尝试":-) (2认同)