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

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

概述我有以下代码通过共享内存进行进程间通信.一个进程写入日志,另一个进程从它读取.一种方法是使用信号量,但是在这里我使用的是原子标志(log_flag),该标志位于共享内存中.日志(log_data)也是共享的. 现在的问题是,这将适用于x86架构,还是需要信号量或互斥体?如果我使log_flag非原子呢?鉴于x86具有严格的内存模型和主动缓存一致性,优化不适用于指针,我认为它仍然可以工作? 编辑:请 我有以下代码通过共享内存进行进程间通信.一个进程写入日志,另一个进程从它读取.一种方法是使用信号量,但是在这里我使用的是原子标志(log_flag),该标志位于共享内存中.日志(log_data)也是共享的.

现在的问题是,这将适用于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有好处吗?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1234731.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存