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

C# 以线程安全的方式从DLL写入文件-但如果许多程序使用此DLL会发生什么?,c#,dll,C#,Dll,假设我有一个DLL,它有一个将数据写入文件的类。再想象一下,该类使用锁来确保没有两个线程同时写入该文件 现在假设我有两个不同的程序A和B,它们分别使用这个DLL 在这两种情况下,写入数据的文件的路径是相同的。在这种情况下,这不再是线程安全的,因为两个程序都在写入同一个文件,对吗?我在DLL帮助中提到的锁只有当它只从程序A使用,而不是同时从程序B使用时,我说的对吗 用另一种方式来回答这个问题:我的观点是,如果只加载了DLL的一个副本,不管是否有许多不同的程序正在使用这个DLL,那么我是安全的,因为

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

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

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


用另一种方式来回答这个问题:我的观点是,如果只加载了DLL的一个副本,不管是否有许多不同的程序正在使用这个DLL,那么我是安全的,因为我在DLL中的锁可以工作,并且不会让所有这些程序中的不同线程以一种不同步的方式写入文件。我说得对吗?

好吧,代码是线程安全的,因为程序a的线程无法更改程序B中线程的状态。同时访问变量和对象不会有问题

但您在访问无法或不应共享的全局资源时遇到问题。还有一些同步程序的方法,例如通过进程间通信,在内部使用命名管道、命名管道或

如果只需要对文件执行一次操作,也可以将文件本身用作同步对象。请参阅方法,尤其是使用选项

只需访问该文件。如果可能,则此进程可以访问该文件。如果不可能,打开文件将导致异常。请等待文件锁释放,然后重试


此时您正在锁定一个对象。在虚拟内存中创建.NET对象。虚拟内存不在进程之间共享,因此每个进程将有一个它锁定的不同对象。因此,使用lock语句无法在进程之间进行同步。

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

我假设你指的是C,它是进程本地的,所以没有任何东西可以阻止两个进程同时写入文件

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

File.Open("test.txt", FileMode.Open, FileAccess.Write, FileShare.Read);
其中指定后续打开文件的尝试仅在读取访问时成功

我的观点是,如果只加载了DLL的一个副本,而不管是否有许多不同的程序正在使用此DLL,那么我是安全的,因为我在DLL中的锁可以工作,并且不会让所有这些程序中的不同线程以非同步方式写入文件。我说得对吗?@Quser:不,锁对物体起作用。一个物体存在于记忆中。每个程序都有不同的内存。即使是静态也没用。好吧,尽管我在类a中有一个静态锁,它可以很好地保护来自不同线程对文件的写入,但是如果另一个程序也通过DLL使用类a并尝试写入文件,我在开始时提到的锁在这里不会有帮助,因为它已经是不同的锁了,因为这个DLL现在是由不同的程序加载的,对吗?嗯,代码运行线程安全,由于程序a的线程无法更改程序B中线程的状态-是的,但在本例中,程序a和程序B正在写入同一个文件,锁不再起作用,因为不同的程序加载了DLL,你明白我的意思吗?您还可以将文件本身用作同步对象。如何?我只需要write@RogerLipscombe:简单C锁,如这里的答案:简单C锁特定于特定进程。如果你想要跨进程锁定,你需要一个命名的互斥体。@RogerLipscombe:我不想要跨进程锁定,首先要弄清楚我关于这个主题的推理是否正确。所以在这种情况下,程序A和程序B可能都会尝试写入同一个文件,我在DLL中的锁不会保护程序B的线程写入同一个文件-当程序A同时写入文件时?好吧,尽管我在类A中有一个静态锁,它可以很好地保护对文件的写入不同的线程,如果另一个程序也通过DLL使用类A并试图写入文件,我在开头提到的锁在这里不会有帮助,因为它已经填充了不同的锁,因为这个DLL现在是由不同的程序加载的,对吗?是的。您需要一个进程间锁定机制,可以是@Thomas提到的机制之一,也可以是文件系统。如果设置了FileShare.None,并且一个进程正在写入,另一个进程也想写入,那么这是不允许的,但是如果第一个进程完成了写入,那么第二个进程现在就可以写入??