2012-06-19 57 views
0

我有一个类有两个功能 - OpenFileCloseFile。他们分别获得mutex并正确发布。这样我就可以在进程和不同线程之间同步文件访问。但是,有一种情况是,线程在关闭它之前第二次将其OpenFile。我想停止一个线程多次打开文件。防止线程拥有互斥两次

+0

如果一个线程试图打开它两次会发生什么? 'InvalidOperationException'? – CodesInChaos

+0

互斥体可以由拥有它的线程获取,它可以重入。你可以使用信号量来代替。请注意死锁的可能性非常高,请考虑您实际上只是试图解决错误的可能性。 –

+0

我需要使文件在线程和进程间同步读/写。只要有一次同一个线程在关闭它之前尝试OpenFile()并重新输入互斥锁,命名的互斥锁就可以很好地工作。在我的应用程序中,捕获这些线程并阻止它们继续运行就足够了。 – user1296490

回答

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

+0

我认为ReaderWriterLock不会在进程之间同步。使用互斥锁我没有问题。他们唯一的问题是他们是我想避免的递归。 – user1296490

0

您可以使用Thread.SetDataThread.GetData存放一些标志,它确定的值当前线程是否打开文件。