gpt4 book ai didi

.net - 是否有全局命名的读写器锁?

转载 作者:行者123 更新时间:2023-12-03 21:23:20 26 4
gpt4 key购买 nike

我有多个服务于一组文件的 asp.net web 应用程序。定期地,在提供文件之前会更新文件,但如果文件正在使用,则无法更新文件。

我可以通过使用命名互斥体来解决这个问题,其中名称是文件路径(当然替换无效字符)。我在其他情况下使用过它,但你可以看到它是多么低效。一次只有一个进程能够提供该文件。

读取器/写入器锁将是完美的,但它们被设计为在单个进程中工作。另外,我必须为每个可能更新的文件创建一个读取器/写入器锁,而且有很多。

我真正需要的是一个可以像互斥锁一样命名的读/写锁。有这样的事情吗?或者可以使用现有的锁创建这样的东西吗?

最佳答案

可以使用互斥锁和信号量来模拟读/写锁。如果我每秒必须访问它数千次,我就不会这样做,但是每秒数十次甚至数百次,它应该可以正常工作。

此锁将允许 1 个写入者进行独占访问或 N 个(可能很大,但您必须定义它)读取者进行并发访问。

这是它的工作原理。我将以 10 个读者为例。

初始化一个命名的互斥体,最初是无信号的,以及一个有 10 个插槽的命名信号量:

  Mutex m = new Mutex(false, "MyMutex");
Semaphore s = new Semaphore(10, 10, "MySemaphore");

获取读者锁:
// Lock access to the semaphore.
m.WaitOne();
// Wait for a semaphore slot.
s.WaitOne();
// Release mutex so others can access the semaphore.
m.ReleaseMutex();

释放读者锁:
s.Release();

获取写锁:
// Lock access to the seamphore
m.WaitOne();
// Here we're waiting for the semaphore to get full,
// meaning that there aren't any more readers accessing.
// The only way to get the count is to call Release.
// So we wait, then immediately release.
// Release returns the previous count.
// Since we know that access to the semaphore is locked
// (i.e. nobody can get a slot), we know that when count
// goes to 9 (one less than the total possible), all the readers
// are done.
s.WaitOne();
int count = s.Release();
while (count != 9)
{
// sleep briefly so other processes get a chance.
// You might want to tweak this value. Sleep(1) might be okay.
Thread.Sleep(10);
s.WaitOne();
count = s.Release();
}

// At this point, there are no more readers.

释放作家锁:
m.ReleaseMutex();

尽管很脆弱(使用它的每个进程都具有相同的信号量计数!),但我认为只要您不尝试太用力,它就会做您想做的事情。

关于.net - 是否有全局命名的读写器锁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/640122/

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