C# 当一个进程写入而另一个进程读取时,我是否需要一个信号量?

C# 当一个进程写入而另一个进程读取时,我是否需要一个信号量?,c#,serialization,ipc,semaphore,C#,Serialization,Ipc,Semaphore,我有两个名为A和B的进程(两个exe文件:A.exe和B.exe),都是用C#实现的。 进程A调用进程B。 在A中,通过使用ISerializable接口将对象序列化为二进制文件。这每隔几毫秒就会发生一次。 进程B反序列化此对象(也每隔几毫秒一次) 我想知道当一个进程从文件中读取而另一个进程写入时是否需要一个信号量。有没有可能B试图读取二进制文件,而A尚未完成写入?如果写入是原子的,这意味着进程B只能在完全写入新数据后才能看到它(否则只能看到旧数据),那么您就不需要同步(信号量等)。当您有线程,

我有两个名为AB的进程(两个exe文件:A.exe和B.exe),都是用C#实现的。 进程A调用进程B。 在A中,通过使用ISerializable接口将对象序列化为二进制文件。这每隔几毫秒就会发生一次。 进程B反序列化此对象(也每隔几毫秒一次)


我想知道当一个进程从文件中读取而另一个进程写入时是否需要一个信号量。有没有可能B试图读取二进制文件,而A尚未完成写入?

如果写入是原子的,这意味着进程B只能在完全写入新数据后才能看到它(否则只能看到旧数据),那么您就不需要同步(信号量等)。当您有线程,并且正在向要共享的内存写入一个字节(写入一个字节将是原子的)时,通常会出现这种情况


在您的例子中,您正在将整个对象序列化为一个绝对不是原子的文件。在这种情况下,需要在两个进程之间进行一些同步。

是的,您需要同步对文件的访问。但这是一种非常奇怪的交流方式(文件)。考虑使用WCF服务——它将自动将序列化数据从一个进程传递到另一个进程,而不需要同步。如果写入和读取之间有延迟,您可以使用WCF服务的MSMQ绑定,该绑定将存储请求直到可以处理为止。IMO Global将比信号量更合适。我同意使用文件进行通信有点奇怪。为此,您需要使用全局信号量/互斥体/其他同步。如果您想使用文件IO,也许命名管道是一种更好的方法,不需要磁盘上的实际文件?正如前面提到的,
Mutex
将是IPC的正确选择。您必须实现非常简单的忙/就绪逻辑,或者使用多个互斥来提高其抗干扰性和灵活性。使用文件以毫秒速率进行互操作不是一个好主意。至少使用命名管道或套接字,您可以免费获得同步。