【发布时间】:2014-11-25 15:52:10
【问题描述】:
我有一个用 pthreads 实现的多线程 C 程序,它使用读写锁来保护特定的数据结构。 pthread_rwlock_rdlock,应该是一个阻塞调用,在调用时可能会失败并返回值 EAGAIN。文档说:
如果出现以下情况,pthread_rwlock_rdlock() 和 pthread_rwlock_tryrdlock() 函数可能会失败:
[EAGAIN]
由于已超出 rwlock 的最大读锁数,无法获取读锁。
这意味着在任何给定时间点可以获得读取锁的最大线程数。考虑到这一点,我创建了一个函数来检查返回值并无限循环,直到它真正获得读锁。
void
cache_rdlock(void)
{
int result= pthread_rwlock_rdlock(&cache_access);
if(result== EAGAIN)
{
while((result= pthread_rwlock_rdlock(&cache_access))== EAGAIN);
}
return;
}
在程序执行过程中的某个时间点,两个并发线程试图获得这个读锁将在这个函数中永久挂起。看到程序在整个执行过程中正确解锁了这个读写锁,我能做些什么来解决这个问题?有没有办法增加并发读锁的最大数量?为了使程序正常运行,我应该对此功能进行哪些更改?
【问题讨论】:
标签: c multithreading