我有一段共享内存,其中包含一个char字符串和两个进程之间的整数。
进程A写入它并且进程B读取它(反之亦然)
确保进程A不会更新(写入)同时进程B正在读取它的最有效和最有效的方法是什么? (我应该只在共享内存中使用标志,使用信号量,关键部分....)
如果你能指出我正确的方向,我将不胜感激。
感谢。
Windows,C ++
答案 0 :(得分:3)
您不能使用Critical Section,因为这些只能用于同一进程中的线程之间的同步。对于进程间同步,您需要使用Mutex或Semaphore。这两者之间的区别在于前者只允许单个线程拥有资源,而后者允许最多允许最大数量(在创建期间指定)以同时拥有资源。
在您的情况下,互斥锁似乎是合适的。
答案 1 :(得分:2)
由于您有两个进程,因此需要跨进程同步对象。我认为这意味着您需要使用mutex。
答案 2 :(得分:1)
互斥对象有助于防止数据争用和允许 线程之间的线程安全数据同步。线程获得 通过调用其中一个锁定函数来获取互斥对象的所有权 通过调用相应的解锁功能放弃所有权。
如果您正在使用boost螺纹,您可以使用它的互斥锁和锁定,更多阅读请参阅以下链接:
答案 3 :(得分:1)
由于您正在讨论两个进程,因此系统范围的互斥锁将起作用,而Windows则具有这些功能。但是,它们不一定是最有效的方式。
如果你可以在共享内存中放入更多内容,那么通过原子操作在该内存中的标志上传递数据应该是最有效的方法。例如,您可以使用Interlocked functions来实现Dekker's Algorithm(您可能希望使用类似YieldProcessor()
的内容来避免繁忙等待。)