gpt4 book ai didi

c - Pthreads - 增加读锁的最大数量

转载 作者:太空宇宙 更新时间:2023-11-04 01:04:28 24 4
gpt4 key购买 nike

我有一个用 pthreads 实现的多线程 C 程序,它使用读写锁来保护特定的数据结构。 pthread_rwlock_rdlock,本应是阻塞调用,调用时可能会失败并返回值 EAGAIN。文档说:

The pthread_rwlock_rdlock() and pthread_rwlock_tryrdlock() functions may fail if:

[EAGAIN]

The read lock could not be acquired because the maximum number of read locks for rwlock has been exceeded.

这意味着在任何给定的时间点,有一个最大数量的线程可以获得读锁。考虑到这一点,我创建了一个函数来检查返回值并无限循环,直到它真正获得读锁。

void
cache_rdlock(void)
{
int result= pthread_rwlock_rdlock(&cache_access);
if(result== EAGAIN)
{
while((result= pthread_rwlock_rdlock(&cache_access))== EAGAIN);
}

return;
}

在程序执行的某个时刻,两个试图获取这个读锁的并发线程将在这个函数中永久挂起。看到程序在整个执行过程中正确解锁了这个读写锁,我该怎么做才能解决这个问题?有没有办法增加并发读锁的最大数量?为了使程序正常工作,我应该对此函数进行哪些更改?

最佳答案

在实现了 rwlocks 之后,我可以非常自信地说,可能没有办法增加系统上并发读取锁的最大数量,而且绝对没有可移植的方法来做到这一点。

在一些基本层面上,rwlock 包含一些当前读取锁定数量的计数器,并且该计数器是一个简单的变量,如 int 或 short,它在每次读取锁定时递增并在解锁时递减。如果它很短,你可以对你的操作系统供应商大喊大叫让它变大(即使持有 64k 读锁看起来很奇怪)如果它是一个 int,你的程序可能已损坏并且不会释放读锁,因为它应该在某处没有错误的情况下很难获得十亿或 4 个读锁。

我说十亿是因为一种非常流行的实现 rwlocks 的方法是使用一个 32 位 int,它使用最低的两个位来指定写锁。

这是一个您可以使用的简单测试程序:

#include <pthread.h>
#include <stdio.h>
#include <limits.h>

int
main(int argc, char **argv)
{
unsigned long long i;
pthread_rwlock_t rw;
int r;

pthread_rwlock_init(&rw, NULL);


for (i = 0; i < INT_MAX; i++) {
if ((r = pthread_rwlock_rdlock(&rw)) != 0)
break;
if (i % 10000000 == 0)
printf("%llu\n", i);
}

printf("%d %llu\n", r, i);

return 0;
}

MacOS 在 1600 万 (2^24) 时中断,Linux 在 20 亿 (2^31) 后不会出错,所以我没有费心再运行它。您可能不想持有那么多读锁。

关于c - Pthreads - 增加读锁的最大数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27131149/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com