我有一段代码(保存),只能由一个进程同时执行,并且使用Mutex成功保护它。
但是,还有一些清理(SavePrep)也可以在受保护的块内部完成,该块可以长时间运行并且可以在受保护的块之外进行COPIED。关键是它必须在受保护的块内部运行,但如果它在受保护的块之外运行一段时间,它将减少在受保护块中花费的时间。 (基本上它准备工作较少。)
现在问题出现了,因为这个SavePrep有一个LOCK选项。我可以在锁定设置为FALSE的受保护块之外运行它,然后受保护的块可以同时运行SavePrep,LOCK设置为TRUE而不会出现问题。但是,如果使用LOCK TRUE运行,则返回不正确,那么使用LOCK FALSE运行将失败。
所以我想做的是阻止受保护块内的SavePrep执行,直到SavePrep在受保护块之外启动为止。
在两种情况下,我都会调用一行代码。无论如何阻止一行代码STARTING执行?
我现在正在做的是调用ReleaseMutex,然后调用SavePrep。但是,我不确定在SavePrep有机会启动之前,坐在WaitOne(..)的下一个进程是否会得到控制权。
目前最近有20或30个进程等待的示例。
Mutex mutex = new Mutex(false, mutexName);
if (mutex.WaitOne(60 * 2 * 1000)
{
//Can take a while. Can accept false to not lock if running outside of Wait
SavePrep(true);
Save();
mutex.ReleaseMutex();
}
我不知道但是对于竞争条件有疑虑:
Mutex mutex = new Mutex(false, mutexName);
if (mutex.WaitOne(60 * 2 * 1000)
{
//Can take a while. Can accept false to not lock if running outside of Wait
SavePrep(true);
Save();
mutex.ReleaseMutex();
}
//Simplified. There is a singleton I've used to keep up with who else is waiting
// on the mutex and the SavePrep is actually called with the necessary data for
// a thread further back in the queue so that when it gets to SavePrep it takes
// less time.
//Is there anyway to guarantee this SavePrep call will execute before another
// enters the WaitOne block?
SavePrep(false);