锁定排序或调度问题

时间:2013-02-06 19:04:41

标签: c locking pthreads scheduling deadlock

我有一个使用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)  

2 个答案:

答案 0 :(得分:3)

看起来您的算法遭受饥饿困扰,您应该对锁定进行排队,请参阅

pthreads: thread starvation caused by quick re-locking

Fair critical section (Linux)

作为评论的答案,什么是互斥(pthread库)

  

互斥锁是一种锁(来自Pthread库),可以保证以下内容   三件事:

     

Atomicity - 锁定互斥锁是一种原子操作,   意味着线程库向您保证,如果您锁定互斥锁,   没有其他线程可以同时锁定该互斥锁。

     

奇点 - 如果某个线程设法锁定互斥锁,则可以确保   没有其他线程能够锁定相同的互斥锁,直到原始   线程释放锁。

     

非忙碌等待 - 如果threadA尝试锁定已锁定的互斥锁   通过threadB,threadA将被挂起(并且不会消耗任何   CPU资源)直到lockB释放锁。当threadB   解锁互斥锁,然后线程A将唤醒并继续   执行,将互斥锁锁定。

它不保证公平。

如果您仍然对pthread_rwlock_rdlock的读者作家公平感兴趣: 允许作家优先于读者,以避免作家饥饿。

答案 1 :(得分:0)

另一种可能性是你的锁已经在A线程上被声称阻止锁定/释放完全释放(锁定计数线程保持太高)。

饥饿是另一个强大的可能性,但你的问题是“过了一段时间A再次获得锁定”,表示超过几微秒:),这应该可以防止饥饿。

您是否有可能从A返回或使用continue语句,从而保持锁定?