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

Posted

技术标签:

【中文标题】当一个进程写入而另一个进程读取时,我是不是需要信号量?【英文标题】:Do I need a Semaphore when one process writes and the other one reads?当一个进程写入而另一个进程读取时,我是否需要信号量? 【发布时间】:2014-05-20 13:54:44 【问题描述】:

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

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

【问题讨论】:

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

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

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

【讨论】:

以上是关于当一个进程写入而另一个进程读取时,我是不是需要信号量?的主要内容,如果未能解决你的问题,请参考以下文章

在同一个后台线程上运行 FMDB 进程?

读写两个进程的同一个文件是不是需要lockfile

处理器间通信,一个处理器写入,另一个读取

linux 共享内存 可不可以不加锁呢? 系统有两个进程,一个负责写入,一个负责读取

四十进程间通信——管道的分类与读写

修改内存映射文件时通知/发出信号