我有一个类有两个功能 - OpenFile
和CloseFile
。他们分别获得mutex
并正确发布。这样我就可以在进程和不同线程之间同步文件访问。但是,有一种情况是,线程在关闭它之前第二次将其OpenFile
。我想停止一个线程多次打开文件。防止线程拥有互斥两次
0
A
回答
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.SetData
和Thread.GetData
存放一些标志,它确定的值当前线程是否打开文件。
相关问题
- 1. C#互斥问题,以防止二次
- 2. Java中互斥线程的互斥量?
- 3. pthread_cond_timedwait超时后线程是否拥有互斥锁?
- 4. pthread_cond_broadcast之后哪个线程拥有关联的互斥锁?
- 5. 防止嵌套建立使用互斥
- 6. 线程和互斥体
- 7. SQLite多线程互斥体
- 8. boost线程互斥阵列
- 9. 互斥与并行线程
- 10. 互斥和线程独立
- 11. 多线程和互斥锁
- 12. 线程同步,互斥
- 13. POSIX线程退出而持有互斥
- 14. Ruby - 使用互斥锁阻止线程过早停止
- 15. 无法获取互斥锁来防止线程访问某个函数
- 16. 为什么即使您拥有互斥锁,互斥锁try_lock也会返回false?
- 17. 多线程互斥锁可以使用多个互斥锁
- 18. 提升interprocess互斥体vs提升线程互斥体
- 19. C#找到进程谁拥有互斥体
- 20. pthread互斥锁两个线程互锁锁定/解锁是否有效?
- 21. 两个线程程序防止死锁
- 22. 互斥或不互斥互斥?
- 23. 互斥体,不阻止当前(UI)线程
- 24. C++线程死锁互斥锁异常终止
- 25. Visual c + +线程与互斥锁不阻止
- 26. 如何防止程序加载两次?
- 27. C - 线程互斥和一般头痛
- 28. C++提升线程和互斥体
- 29. std ::线程和std ::互斥问题
- 30. C++ windows线程和互斥问题
如果一个线程试图打开它两次会发生什么? 'InvalidOperationException'? – CodesInChaos
互斥体可以由拥有它的线程获取,它可以重入。你可以使用信号量来代替。请注意死锁的可能性非常高,请考虑您实际上只是试图解决错误的可能性。 –
我需要使文件在线程和进程间同步读/写。只要有一次同一个线程在关闭它之前尝试OpenFile()并重新输入互斥锁,命名的互斥锁就可以很好地工作。在我的应用程序中,捕获这些线程并阻止它们继续运行就足够了。 – user1296490