我想知道使用存储在共享内存中的对象的最佳做法是什么。我想到的选项是:
- 为存储在共享内存中的对象的每个成员函数添加volatile
- 在每次迭代时将整个数据从/复制到共享内存。
- 无需使用 volatile 即可访问共享内存。
让我解释一下我遇到的问题:
我有两个进程在 FPGA 上的 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
`bool TimeTTJ2000::get_Tu_UT1(double&, const int32&, const int32&) const' 的 this' 参数丢弃限定符
(上面的代码只是为了解释而编造的,错误信息来 self 的真实代码,其中MyData的大小要大得多。)
要消除该错误,在我看来我必须定义另一个成员函数,例如
MyTime::convert(double* answer) volatile;
但在我看来,我必须向库中不一定属于我的所有函数添加“volatile”是荒谬的。
为了避免到处都是'volatile',我想我可以在一个进程解锁后立即将共享内存中的全部数据复制到本地,并在进程被锁定之前写回共享内存。这样一来,我就不会为 volatile 而烦恼,但这仍然是明智之举吗?
或者我可以在不首先使用 volatile 的情况下访问共享内存数据吗?那会让我的生活更轻松。 (我对共享内存和volatile的经验很少。我不太确定什么时候需要volatile。当然我知道基础知识,比如volatile抑制优化。)
最佳答案
But it seems to me ridiculous that I have to add 'volatile' to all the functions in the libraries that are not necessarily mine.
这就是 c++ 标准所说的应该做的。您可以放弃 const/volatile 说明符,但这样做可能会引入 UB。
Or can I access shared memory data without using volatile in first place?
是的,您不需要 volatile 来访问共享内存。由于您使用信号量锁定访问权限,因此无需复制数据。
如果您的 FPGA 写入某些内存(不是共享内存),您将需要 volatile。
关于存储在共享内存中的 C++ 对象(volatile 成员函数?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18629170/