gpt4 book ai didi

c - 如何在 C 中使用 n+1 信号量防止读写器死锁

转载 作者:行者123 更新时间:2023-11-30 18:03:46 24 4
gpt4 key购买 nike

嘿,大家好,我正在考虑如何使一个文件由 n 个读取器和一个写入器读取,其中每个操作都有不同的偏移量和大小。出于这个动机,我希望:-

1) 最大并发数2) 防止读取器读取写入器正在写入该区域中任何偏移量的文件区域3)但是,只要写入器与读取器没有任何重叠,多个读取器就可以读取文件的重叠区域4)最后读者也不应该饿死作者

如何使用 n+1 信号量来实现这种情况。有没有我可以引用的示例解决方案。谢谢

这是我的伪代码:-

lock
lock lockarray[m+1]
lockentry = set Lock Entry[Item number]
writer code:
wait(mutex[item number]);
readcount[item number]--;
if read count[item number]==0
signal (wrt[item number]);
signal (mutex[item number])
}

lock
lock lockarray[m+1]
lockentry = set Lock Entry[Item number]
Reader code:
wait(mutex[item number]);
read count[item number]++;
if read count[item number]==1
wait (wrt[item number]);
wait(mutex[item number]);
signal mutex[item number];

最佳答案

如果您想对文件执行此操作,您可以定义一定的粒度并根据该粒度声明锁。例如,对于大文件,您可以使用 4k 的大小(系统上页面的大小),并表示每个读/写锁在文件上的粒度为 4k,锁的数量就是文件大小/4k。您可以使用所需的任意大小,当然,需要在更细粒度的锁定(更多内存来跟踪区域锁定)和实现最佳性能之间进行权衡。

你可以尝试类似的事情

#define MYGRANULARITY 4096
lock filelocks[file_size / MYGRANULARITY];

/* Code to do read or write */
int lock_idx = location_to_rw / MYGRANULARITY;
lock(filelocks[lock_idx]);
/* do work with it */
unlock(filelocks[lock_idx]);

要锁定粒度锁,您所要做的就是找到需要获取哪个锁并执行正常的 R/W 锁定行为。

关于c - 如何在 C 中使用 n+1 信号量防止读写器死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8033837/

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