1

我目前正在使用Mutex在进程之间建立对文件的同步访问,如下所示:

//Process 1
//High frequency "writes"
try
{
    mutex.WaitOne(System.Threading.Timeout.Infinite);

    try
    {
        //Do write operation

    }
    finally
    {
        mutex.ReleaseMutex();
    }
}
catch(AbandonedMutexException)
{
    //Log error
}

然后有时我可能需要检查已写入文件的内容:

//Process 2
//Low frequency "reads"
try
{
    mutex.WaitOne(System.Threading.Timeout.Infinite);

    try
    {
        //Do read operation

    }
    finally
    {
        mutex.ReleaseMutex();
    }
}
catch(AbandonedMutexException)
{
    //Log error
}

但是这种技术发生的情况是Process 2,正在执行低频“读取”的那个似乎挂断并且永远不会接收到对资源的​​访问,或者这样做可能需要很长时间。

在我的情况下有更好的锁吗?

PS。它必须兼容才能在进程之间使用。

4

2 回答 2

1

我想我通过引入一个事件来解决它:

EventWaitHandle event = new EventWaitHandle(true, 
     EventResetMode.ManualReset, 
     strEventGlobalName,     //Must be the same for each process
     out dummy, 
     eventSecurity);         //To allow access between processes

那么作者将看起来像这样:

//Process 1
//High frequency "writes"

//Wait to allow writing
if (event.WaitOne(System.Threading.Timeout.Infinite))
{
    try
    {
        mutex.WaitOne(System.Threading.Timeout.Infinite);

        try
        {
            //Do write operation

        }
        finally
        {
            mutex.ReleaseMutex();
        }
    }
    catch(AbandonedMutexException)
    {
        //Log error
    }
}

和这样的读者:

//Process 2
//Low frequency "reads"

try
{
    //Reset event to halt writing
    if (!event.Reset())
        throw new Exception("Did not reset event");

    try
    {
        mutex.WaitOne(System.Threading.Timeout.Infinite);

        try
        {
            //Do read operation

        }
        finally
        {
            mutex.ReleaseMutex();
        }
    }
    catch(AbandonedMutexException)
    {
        //Log error
    }
}
finally
{
    //Set event to allow back writing
    if(!event.Set())
        throw new Exception("Did not set event");
}
于 2013-05-27T23:04:42.683 回答
0

您是否使用这样的命名互斥锁?:

bool created = false;       
string mutexHandle = "SOME_UNIQUE_ENOUGH_STRING_slkuhfwer7487rctcwf6gt86efcwwgsa";
var myFileLock = new Mutex(true, mutexHandle, out created);

因为只有一个命名的 Mutex 可以用于在系统级别的进程之间同步任务。

如果是这样,您正在做正确的事情(技术上)。

但是,如果您在一端执行高频操作;Thread.Sleep(1);你应该像以前一样在 writer 中提供一个空白mutex.WaitOne(System.Threading.Timeout.Infinite);(例如);或者您应该使用另一种方法,例如内存映射文件,或写入新的标记文件(通过在名称中提供时间戳并删除读取的文件)或使用为您的文件提供版本控制的工具。

于 2013-05-27T20:13:42.550 回答