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

时间:2011-11-07 07:39:38

标签: c deadlock semaphore

嘿伙计们,我正在考虑如何让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];

1 个答案:

答案 0 :(得分:0)

如果要在文件上执行此操作,可以定义特定的粒度并根据该粒度声明锁定。例如,对于大文件,您可以使用4k(系统上页面大小)的大小,并说每个r / w锁在文件上的粒度为4k,锁的数量只是file / 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锁定行为。