c – IPC通过共享内存与atomic_t;对x86有好处吗?

前端之家收集整理的这篇文章主要介绍了c – IPC通过共享内存与atomic_t;对x86有好处吗?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有以下代码通过共享内存进行进程间通信.一个进程写入日志,另一个进程从它读取.一种方法是使用信号量,但是在这里我使用的是原子标志(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;
}

解决方法

您可能希望在循环中使用以下宏,以避免强调内存总线:
#if defined(__x86_64) || defined(__i386)
#define cpu_relax() __asm__("pause":::"memory")
#else
#define cpu_relax() __asm__("":::"memory")
#endif

而且,它作为内存屏障(“内存”参数),所以不需要将log_flag声明为volatile.

但是我认为这是过分的,只能用于硬实时的东西.你应该可以使用futex.也许你可以简单地使用管道,这对于几乎所有的目的都是足够快的.

猜你在找的C&C++相关文章