gpt4 book ai didi

pthreads - 为什么 `pthread_mutex_lock` 存在时需要 `pthread_mutex_trylock`?

转载 作者:行者123 更新时间:2023-12-02 07:42:53 26 4
gpt4 key购买 nike

pthread_mutex_trylock 检测死锁,不阻塞,那你为什么“需要” pthread_mutex_lock

也许当你故意想让线程阻塞?但那样的话可能会导致死锁?

最佳答案

pthread_mutex_trylock 检测死锁。

您可以使用它来避免死锁,但您必须通过将自己的代码包裹在它周围来做到这一点,有效地在循环中多次调用 pthread_mutex_trylock out,之后你的线程释放它的所有资源。

在任何情况下,只要遵循所有线程以相同顺序分配资源的简单规则,即使使用 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 的主要原因。

关于pthreads - 为什么 `pthread_mutex_lock` 存在时需要 `pthread_mutex_trylock`?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9257458/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com