我有一个使用pthreads的C应用程序。
两个线程(比如A和B)之间存在锁争用,其中A在B等待锁定时首先获得锁定,一旦A完成并释放锁定,B仍然无法获得锁定A再次获得锁定(A确实获得并在循环中释放) 如果我将我的进程附加到gdb并在它放弃锁定并在线程B上手动继续后暂停线程A,那么它就会得到它并完成所需的操作。
对我来说这看起来不像死锁。 什么可能阻止线程B获得锁定?非常感谢任何帮助。
示例代码:
主题A:
while (true)
{
lock.acquire(lock)
// Do stuff
lock.release(lock)
// Do more stuff
}
主题B:
lock.acquire(lock)
// Do some stuff
lock.release(lock)
答案 0 :(得分:3)
看起来您的算法遭受饥饿困扰,您应该对锁定进行排队,请参阅
pthreads: thread starvation caused by quick re-locking
或
作为评论的答案,什么是互斥(pthread库)
互斥锁是一种锁(来自Pthread库),可以保证以下内容 三件事:
Atomicity - 锁定互斥锁是一种原子操作, 意味着线程库向您保证,如果您锁定互斥锁, 没有其他线程可以同时锁定该互斥锁。
奇点 - 如果某个线程设法锁定互斥锁,则可以确保 没有其他线程能够锁定相同的互斥锁,直到原始 线程释放锁。
非忙碌等待 - 如果threadA尝试锁定已锁定的互斥锁 通过threadB,threadA将被挂起(并且不会消耗任何 CPU资源)直到lockB释放锁。当threadB 解锁互斥锁,然后线程A将唤醒并继续 执行,将互斥锁锁定。
它不保证公平。
如果您仍然对pthread_rwlock_rdlock
的读者作家公平感兴趣:
允许作家优先于读者,以避免作家饥饿。
答案 1 :(得分:0)
另一种可能性是你的锁已经在A线程上被声称阻止锁定/释放完全释放(锁定计数线程保持太高)。
饥饿是另一个强大的可能性,但你的问题是“过了一段时间A再次获得锁定”,表示超过几微秒:),这应该可以防止饥饿。
您是否有可能从A返回或使用continue语句,从而保持锁定?