防止线程拥有两次互斥锁

时间:2012-06-19 10:16:15

标签: c# mutex

我有一个包含两个函数的类 - OpenFileCloseFile。他们分别获得mutex并适当释放。这样我就可以在进程和不同线程之间同步文件访问。但是,有一种情况是线程在关闭之前第二次OpenFile。我想阻止一个线程不止一次打开文件。

2 个答案:

答案 0 :(得分:0)

由于您没有代码示例,因此很难确切地看到您正在做什么。

您的锁定模式似乎是错误的。您需要控制打开和关闭文件的流程。

实现此目的的一种方法是将文件访问权限修改为单一类型的模式。在单例内,您在打开文件时获得锁定。执行写入,关闭文件并解锁。所有访问都是通过这一个地方完成的,因此应该有助于协调您的文件访问。

这是多线程单例的基本框架,与之前建议的ReadWriterLock结合使用。

using System;

public sealed class Singleton
{
    private static volatile Singleton instance;
    private static object syncRoot = new Object();
    private static ReaderWriterLockSlim cacheLock = new ReaderWriterLockSlim();

    private Singleton() {}

    public static Singleton Instance
    {
      get 
      {
         if (instance == null) 
         {
            lock (syncRoot) 
            {
               if (instance == null) 
                  instance = new Singleton();
            }
         }

         return instance;
      }
    }

    public void WriteToFile(string value)
    {
        cacheLock.EnterWriteLock();
        try
        {
            // perform your file write here
        }
        finally
        {
            cacheLock.ExitWriteLock();
        }
    }

}

请看一下这里的注释和示例,这应该会有所帮助:

http://msdn.microsoft.com/en-us/library/ff650316.aspx

http://msdn.microsoft.com/en-us/library/system.threading.readerwriterlockslim.aspx

答案 1 :(得分:0)

您可以使用Thread.SetDataThread.GetData来存储某个标志的值,该标志用于确定当前线程是否打开文件。