以线程安全的方式从DLL写入文件 - 但是如果许多程序使用此DLL会发生什么?

时间:2015-10-21 11:05:25

标签: c# dll

想象一下,我有DLL,它有将数据写入文件的类。想象一下,该类使用锁来确保没有两个线程同时写入该文件。

现在假设我有两个不同的程序A和B 单独使用此DLL。

在这两种情况下,写入数据的文件的路径是相同的。在这种情况下,这不再是线程安全的,因为两个程序都写入同一个文件,对吗? 我在DLL中提到的锁仅在仅从程序A使用时才有用,而不是同时从程序B使用,我是对的吗?

以不同的方式提出这个问题:我的观点基本上是如果只有一个DLL的单个副本加载,无论许多不同的程序使用这个DLL,那么我是安全的,因为我在DLL中使用的锁将起作用 - 并且不允许所有这些程序中的不同线程以不同的方式写入文件。我是对的吗?

2 个答案:

答案 0 :(得分:0)

嗯,代码运行是线程安全的,因为程序A的一个线程不能改变程序B中线程的状态。你不会同时访问变量和对象的问题。

但是您有访问不能或不应该共享的全局资源的问题。还有一些方法可以同步程序,例如:使用IPCChannel(进程间通信,内部使用命名管道),名为MutexEventWaitHandle

如果只需要对文件执行单个操作,您还可以将文件本身用作同步对象。请参阅File.Open()方法,尤其是使用FileShare.None选项。

只需访问该文件即可。如果可能,则此进程可以访问该文件。如果不可能,打开文件将导致异常。等到文件锁被释放,然后再试一次。

目前你是lock一个物体。在(虚拟)内存中创建.NET对象。虚拟内存在进程之间共享,因此每个进程将拥有一个锁定的不同对象。因此,使用lock语句无法实现进程之间的同步。

答案 1 :(得分:0)

DLL中的代码将在加载它的每个进程中执行。

我假设你的意思是C#lock,它是进程本地的,所以没有什么能阻止两个进程同时写入文件。

你最好的办法是让文件系统处理它。以防止其他进程写入文件的模式打开文件:

File.Open("test.txt", FileMode.Open, FileAccess.Write, FileShare.Read); 

其中FileShare.Read指定后续尝试打开文件只会成功进行读取访问。