【发布时间】:2016-07-05 17:05:14
【问题描述】:
我正在制作一个允许访问系统范围共享资源的库,并希望在其上设置一个类似互斥锁的锁。我过去曾使用Mutex 类来同步不同线程或进程中的操作。
在 UI 应用程序中可能会出现问题。我正在制作的库用于多种产品,其中一些是位于同一主机 UI 应用程序中的插件。因此,库的每个实例的 UI 线程都是相同的 - 因此mutex.WaitOne() 将返回 true,即使资源已被访问。
“资源”是用户的注意力。无论哪个主机进程想要打开它,我都不想打开一个以上的特定子窗口。此外,它可能是另一个线程知道何时可以释放互斥锁(子窗口关闭)。
有没有我可以应用的类或模式,可以让我轻松解决这个问题?
总结我的意图,这可能是理想的虚构类:
var specialMutex = new SpecialMutex("UserToastNotification");
specialMutex.WaitOne(0); // Returns true only once, even on the same thread,
// and is respected across different processes.
specialMutex.Release(); // Can be called from threads other than the one
// that called WaitOne();
是的,Release 看起来很危险,但它只被资源调用。
【问题讨论】:
-
所以使用初始值为 1 的
Semaphore。 -
很难理解为什么 bool 不能解决这个问题。在 UI 线程上调用 WaitOne() 是非常邪恶的,永远不要那样做。您最好注意一个非常不同的错误生成器,您所描述的只有在您的代码可重入时才会发生。可能有人在调用 DoEvents(),确保不是你。或者有人在调用 WaitOne(),那也可以。
-
@HansPassant:
bool跨进程?请详细说明。 -
一个在自己的进程中运行的插件?不太可能。
-
@HansPassant 抱歉不清楚:插件不是唯一的消费者。该库的其他实例在独立桌面应用程序中运行。
标签: c# multithreading thread-safety mutex