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



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

现在假设我有两个不同的程序A和B,它们分别使用这个DLL。

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


以不同的方式提出这个问题:我的观点基本上是如果只有一个单一的拷贝加载的DLL,不管是否有许多不同的程序正在使用这个DLL,那么我是安全的,因为我在DLL中的锁将工作-并且不让来自所有这些程序的不同线程以一种out的syn方式写入文件。我说的对吗?

这段代码是线程安全运行的,因为程序a的线程不能改变程序b中的线程的状态,这样就不会出现变量和对象同时被访问的问题了。

但是你有一个问题,访问全局资源,不能或不应该共享。同步程序也有多种方法,例如使用IPCChannel(进程间通信,内部使用命名管道)、命名互斥锁或EventWaitHandle。

如果只需要对文件进行一次操作,也可以使用文件本身作为同步对象。请参阅File.Open()方法,特别是使用FileShare。没有选择。

简单地访问文件。如果可能,则该进程可以访问该文件。如果不可能,打开文件将导致异常。请等待文件锁被释放,然后再试一次。

此刻你正在lock一个对象。. net对象是在(虚拟)内存中创建的。虚拟内存在进程之间是而不是共享的,因此每个进程将有一个它所锁定的不同对象。因此,使用lock语句无法实现进程间的同步。

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

我假设你指的是c#锁,它是进程本地的,所以没有什么可以阻止两个进程同时写入文件。

你最好的办法是让文件系统处理它。以防止其他进程写入的模式打开文件: <>之前FileMode File.Open("用法"。开放,FileAccess。写,FileShare.Read);之前

文件共享。Read指定后续打开文件的尝试将仅在读取访问时成功。