现在的问题是,这将适用于x86架构,还是需要信号量或互斥体?如果我使log_flag非原子呢?鉴于x86具有严格的内存模型和主动缓存一致性,优化不适用于指针,我认为它仍然可以工作?
编辑:请注意,我有一个具有8个内核的多核处理器,所以我在这里等待繁忙时没有任何问题!
// Process 1 calls this functionvoID write_log( voID * data,size_t size ){ while( *log_flag ) ; memcpy( log_data,data,size ); *log_flag = 1;}// Process 2 calls this functionvoID 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 – IPC通过共享内存与atomic_t;对x86有好处吗?全部内容,希望文章能够帮你解决c – IPC通过共享内存与atomic_t;对x86有好处吗?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)