存储在共享内存中的C ++对象(volatile成员函数?)

时间:2013-09-05 06:26:23

标签: c++ memory memory-management shared-memory volatile

我想知道使用存储在共享内存中的对象有什么好处。我心中的选择是:

  1. 将volatile添加到存储在共享内存中的对象的每个成员函数
  2. 每次迭代从/向共享内存复制整个数据。
  3. 访问没有易失性的共享内存。
  4. 让我解释一下我遇到的问题:

    我在Linux上运行了两个进程。它们通过共享内存传输数据。由于它们通过二进制信号量相互锁定,因此一次只能有一个进程完成其工作。编译器是g ++ 3.4.x.我目前的代码如下:

    struct MyTime
    {
      int32 dayNumber;
      int32 milliSecOfDay;
      void convert(double* answer);
    };
    struct MyData
    {
      double var1;
      MyTime time;
    };
    volatile MyData* ptr;
    ptr = (volatile MyData*)shmat(shmid, NULL, 0);
    
    double answer;
    ptr->time.convert(&answer);  //< ERROR(*)
    

    *:错误:传递const volatile TimeTTJ2000' as这个&#39; `bool TimeTTJ2000 :: get_Tu_UT1(double&amp;,const int32&amp;,const int32&amp;)const&#39;的参数丢弃限定符

    (上面的代码只是为了解释。错误信息来自我的真实代码,其中MyData的大小要大得多。)

    要删除该错误,我觉得我必须定义另一个成员函数,如

    MyTime::convert(double* answer) volatile;
    

    但在我看来,我必须添加“不稳定”这一点似乎很荒谬。对库中不一定是我的所有功能。

    避免让人感到不稳定&#39;在任何地方,我想我可以在一个进程解锁后立即将共享内存中的整个数据复制到本地,并在进程被锁定之前写回共享内存。通过这种方式,我不会感到烦恼,但这仍然是明智之举吗?

    或者我可以在不使用volatile的情况下访问共享内存数据吗?这会让我的生活更轻松。 (我对共享内存和易失性方面的经验很少。我不太确定何时需要使用volatile。当然我知道基本知识,例如,volatile会抑制优化。)

1 个答案:

答案 0 :(得分:1)

  

但在我看来,我必须将“易变”添加到库中不一定是我的所有函数中,这似乎是荒谬的。

这就是c ++标准所说的应该完成的事情。您可以抛弃const / volatile说明符,但这样做可以引入UB。

  

或者我可以在不使用volatile的情况下访问共享内存数据吗?

是的,您不需要volatile来访问共享内存。由于您使用信号量锁定访问权限,因此无需复制数据。

如果FPGA写入某些内存(非共享内存),则需要使用volatile。

相关问题