【发布时间】:2015-07-24 04:46:53
【问题描述】:
今天早些时候,我正在调试一些类似这样的东西:
class Foo {
void AccessCriticalSection() {
try {
if (IO.File.Exists("\\path\to\lock.txt")
throw new Exception();
System.IO.File.Create("\\path\to\lock.txt");
criticalSection();
} catch (Exception ex) {
// ignored
}
}
void CriticalSection() {
// banana banana banana
System.IO.File.Delete("\\path\to\lock.txt");
}
}
让我们甚至不要谈论这有多可怕……但它本质上是在尝试使用一个名为 lock.txt 的文件作为其互斥体。该操作不是原子的,如果另一个进程正在使用它,其他进程只是没有通过关键部分(如果你相信的话,它们旨在能够在释放锁后继续)等等。显然它需要修复。
如何正确获取锁以跨多个进程同步对文件系统的访问?这些进程是同一进程的多个实例,因此它们可以共享一些协议,而不是专门锁定目录(即,它们可以轻松地使用等同于某些类的所有实例锁定 private final static Object lock = new Object(); 之类的东西来同步访问静态方法)
【问题讨论】:
-
你为什么不看Mutex?
-
@AdriaanStander 我喜欢我什至把它放在描述中。大声笑。
标签: c# windows multithreading