我有以下代码用于通过共享内存进行进程间通信。一个进程将日志写入,另一个进程从中读取。其中一种方法是使用信号量,但在这里我使用类型为 atomic_t 的原子标志 (log_flag),它驻留在共享内存中。日志 (log_data) 也是共享的。
现在的问题是,这是否适用于 x86 架构,或者我需要使用信号量或互斥锁?如果我使 log_flag 非原子性会怎样?鉴于 x86 具有严格的内存模型和积极的缓存一致性,并且指针上不应用优化,我认为它仍然可以工作吗?
编辑:请注意,我有一台带有 8 个核心的多核处理器,因此在这里没有忙等待的问题!
现在的问题是,这是否适用于 x86 架构,或者我需要使用信号量或互斥锁?如果我使 log_flag 非原子性会怎样?鉴于 x86 具有严格的内存模型和积极的缓存一致性,并且指针上不应用优化,我认为它仍然可以工作吗?
编辑:请注意,我有一台带有 8 个核心的多核处理器,因此在这里没有忙等待的问题!
// Process 1 calls this function
void write_log( void * data, size_t size )
{
while( *log_flag )
;
memcpy( log_data, data, size );
*log_flag = 1;
}
// Process 2 calls this function
void read_log( void * data, size_t size )
{
while( !( *log_flag ) )
;
memcpy( data, log_data, size );
*log_flag = 0;
}
volatile
对于多线程是无用的。 - GManNickG*log_flag
的值,而不是将其缓存在寄存器中(将忙等待转换为无限循环)。当我们有2个进程在2个CPU上,并且存在共享内存时,对内存的更改对于编译器来说看起来非常像内存映射硬件
操作或信号处理程序
操作。 - osgxvolatile
关键字,编译器会对这段代码while( *log_flag ) ;
进行自由优化,可能会变成int tmp = *log_flag; while(tmp) ;
。volatile
并不是毫无用处,只是其与Java中的volatile
有所不同。 - Bartosz Milewski