gpt4 book ai didi

并发队列,C

转载 作者:行者123 更新时间:2023-12-04 14:42:32 39 4
gpt4 key购买 nike

因此,我试图在 C 中实现并发队列。我将方法分为“读取方法”和“写入方法”。因此,在访问写入方法(如 push() 和 pop())时,我获得了写入器锁。读取方法也一样。此外,我们可以有多个读者,但只有一个作者。

为了让它在代码中工作,我为整个队列设置了一个互斥锁。还有两个条件锁——一个给作者,另一个给读者。我还有两个整数来跟踪当前使用队列的读者和作者的数量。

所以我的主要问题是 - 如何实现多个读取器同时访问读取方法?

目前这是我的一般读取方法代码:(在伪代码中 - 不是 C。我实际上使用的是 pthreads)。

mutex.lock();
while (nwriter > 0) {
wait(&reader);
mutex.unlock();
}
nreader++;
//Critical code
nreader--;
if (nreader == 0) {
signal(&writer)
}
mutex.unlock

所以,假设我们有一个持有互斥体的读者。现在任何其他出现并试图获取互斥锁的读者都无法获取。不会堵吗?那么有多少读者同时访问读取方法呢?

我的推理正确吗?如果是,如何解决问题?

最佳答案

如果这不是练习,请使用 pthreads 的读写锁(pthread_rwlock_* 函数)。

另请注意,使用锁保护单个调用可能无法提供必要的正确性保证。例如,从 STL 队列中弹出一个元素的典型代码是

if( !queue.empty() ) {
data = queue.top();
queue.pop();
}

即使在队列方法内部使用锁,这在并发代码中也会失败,因为从概念上讲这段代码必须是一个原子事务,但实现不提供这样的保证。线程可能会弹出与 top() 读取的元素不同的元素,或者尝试从空队列中弹出,等等。

关于并发队列,C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5974604/

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