Met*_*est 10 c c++ linux gcc c++11
我有以下代码通过共享内存进行进程间通信.一个进程写入日志,另一个进程从中读取.一种方法是使用信号量,但在这里我使用的是atomic_t类型的原子标志(log_flag),它位于共享内存中.日志(log_data)也是共享的.
现在问题是,这适用于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;
}
Run Code Online (Sandbox Code Playgroud)
我不建议这样做,原因有两个:首先,虽然编译器可能不会优化指针访问,但这并不意味着处理器不会缓存指向的值。其次,它是原子的这一事实不会阻止 while 循环末尾和 *log_flag=0 行之间的读取访问。互斥锁更安全,但速度要慢得多。
如果您使用 pthreads,请考虑使用 RW 互斥体来保护整个缓冲区,这样您就不需要标志来控制它,互斥体本身就是标志,并且在频繁读取时您将获得更好的性能。
我也不建议执行空 while() 循环,这样会占用所有处理器。在循环内放入 usleep(1000) 以使处理器有喘息的机会。
| 归档时间: |
|
| 查看次数: |
1462 次 |
| 最近记录: |