想象一下,我有DLL,它有将数据写入文件的类。想象一下,该类使用锁来确保没有两个线程同时写入该文件。
现在假设我有两个不同的程序A和B 单独使用此DLL。
在这两种情况下,写入数据的文件的路径是相同的。在这种情况下,这不再是线程安全的,因为两个程序都写入同一个文件,对吗? 我在DLL中提到的锁仅在仅从程序A使用时才有用,而不是同时从程序B使用,我是对的吗?
以不同的方式提出这个问题:我的观点基本上是如果只有一个DLL的单个副本加载,无论许多不同的程序使用这个DLL,那么我是安全的,因为我在DLL中使用的锁将起作用 - 并且不允许所有这些程序中的不同线程以不同的方式写入文件。我是对的吗?
答案 0 :(得分:0)
嗯,代码运行是线程安全的,因为程序A的一个线程不能改变程序B中线程的状态。你不会同时访问变量和对象的问题。
但是您有访问不能或不应该共享的全局资源的问题。还有一些方法可以同步程序,例如:使用IPCChannel(进程间通信,内部使用命名管道),名为Mutex或EventWaitHandle。
如果只需要对文件执行单个操作,您还可以将文件本身用作同步对象。请参阅File.Open()方法,尤其是使用FileShare.None选项。
只需访问该文件即可。如果可能,则此进程可以访问该文件。如果不可能,打开文件将导致异常。等到文件锁被释放,然后再试一次。
目前你是lock
一个物体。在(虚拟)内存中创建.NET对象。虚拟内存在进程之间不共享,因此每个进程将拥有一个锁定的不同对象。因此,使用lock
语句无法实现进程之间的同步。
答案 1 :(得分:0)
DLL中的代码将在加载它的每个进程中执行。
我假设你的意思是C#lock,它是进程本地的,所以没有什么能阻止两个进程同时写入文件。
你最好的办法是让文件系统处理它。以防止其他进程写入文件的模式打开文件:
File.Open("test.txt", FileMode.Open, FileAccess.Write, FileShare.Read);
其中FileShare.Read指定后续尝试打开文件只会成功进行读取访问。