Mutex + Lock基于行执行,但不一定完成

时间:2013-07-01 17:35:17

标签: c# .net-3.5 mutex

我有一段代码(保存),只能由一个进程同时执行,并且使用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);  

0 个答案:

没有答案