- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
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/
我花了一周的时间来修复一个程序,一开始我得到了SIGBUS,但经过多次尝试后程序仍然得到了SIGSEGV段错误,在下面我发布了段错误日志+源代码。如果专家帮助我修复此段错误错误,我将非常感激。任何建议
我正在使用 pthread_mutex_trylock 将互斥锁锁定在一个结构上,以便它只能在给定时间由单个线程访问/修改。如果互斥体已经被锁定,我只是从例程返回而不是排队/阻塞。 这是我的代码的基本
在我的代码中,我使用 pthread_mutx_trylock() 来检查线程 1 是否已完成他的任务工作并释放互斥锁吗?请让我知道它是否有效? 在线程 1 中: pthread_mutex
/////////////////////////////////* pthread_mutex_t stop = PTHREAD_MUTEX_INITIALIZER; int a = 1; void
我正在学习在 Linux 编程中使用互斥量。我遇到了 trylock 函数,它首先检查互斥量是否可用,否则将其锁定,然后返回。 现在我的问题是: 调用trylock时,是否在未执行临界区的情况下到达函
最近看了memcached的源码,在文件 memcached.h 中。我找到了这段代码: static inline int mutex_lock(pthread_mutex_t *mutex) {
我有以下测试程序。 #include #include using namespace std; pthread_mutex_t mymutex = PTHREAD_MUTEX_INITIA
pthread_mutex_trylock 检测死锁,不阻塞,那你为什么“需要” pthread_mutex_lock? 也许当你故意想让线程阻塞?但那样的话可能会导致死锁? 最佳答案 pthread
一旦线程被取消,就需要解锁互斥体,以避免死锁。所以我设计了以下方法: // file_a.c pthread_attr_t attr; ... rc2 = pthread_attr_init(&att
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 要求提供代码的问题必须表现出对所解决问题的最低限度理解。包括尝试过的解决方案、为什么它们不起作用,以及预
这是对 this 的跟进问题。 在该代码中,当我不使用 fflush(stdout) 时,当我保持 sleep(1) 时,输出不会刷新到屏幕上。 #define S sleep(0) void* xT
我是一名优秀的程序员,十分优秀!