У меня есть многопоточная программа на C, реализованная с помощью pthreads, которая использует блокировку чтения и записи для защиты определенной структуры данных. pthread_rwlock_rdlock
, который должен быть блокирующим вызовом, может выйти из строя и вернуть значение EAGAIN при вызове. В документации сказано:Pthreads - Увеличьте максимальное количество блокировок чтения
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;
}
В определенный момент во время выполнения программы, два параллельных потоков пытаются получить этот замок чтения будет висеть постоянно в этой функции. Если программа правильно разблокирует эту блокировку чтения и записи во время ее выполнения, что я могу сделать для решения этой проблемы? Есть ли способ увеличить максимальное количество одновременных блокировок чтения? Какие изменения следует внести в эту функцию, чтобы программа работала правильно?
Спасибо за то, что я пролил свет на этот вопрос, я перепроверю базу кода. –