我有点了解我的知识。
我有三个进程通过共享内存段进行通信。并发访问是通过正确的锁定处理的(以避免在这里被误解),所以我很确定我正在按照预期的方式使用 volatile 关键字。
我的共享内存段被转换为指向结构的易失性指针,我可以对此进行操作。该结构必须是易失的,因为有时我需要旋转直到共享内存上的某些值发生变化 - 所以不使用易失性不是一种选择。
现在我正在使用一个外部 C++ 库(SystemC,但这在这里无关紧要),我的结构从中包含 sc_time 的成员。虽然我可以访问库的源代码,但我不想依赖我所做的修改,可能会破坏东西或陷入维护地狱。
现在这个类“sc_time”有比较和赋值的操作符。这些运算符不适用于 volatile sc_time - 到目前为止并不奇怪。
现在我的问题是:有没有办法在不破坏语义的情况下转换这种易失性?我可以使用经常提到的 const_cast<> 或简单的 C-cast,但是编译器会做什么呢?我什至可以只使用 memcpy() 数据——但话又说回来,结果会是什么?
任何建议都将受到欢迎 - 我使用纯 C 包装器或任何其他方法完全没有问题 - 只要它有效(tm),但我最后的手段是一些类似于 memcpy 的小型汇编代码,用于真正阅读数据 - 这是我想避免的事情。
感谢您抽出宝贵时间阅读本文 :-)
编辑:添加小代码片段:
struct shared_memory{
sc_time time1;
sc_time time2;
sc_time time3;
...
}
...
class foo
{
foo(); // attach shared memory and assign to *mem
...
pthread_mutex_t mutex;
volatile struct shared_memory *mem;
...
void do_stuff(); // periodically called
};
void foo::do_stuff()
{
...
lock_mutex(mutex);
sc_time t1 = mem->time1;
sc_time t2 = mem->time2;
sc_time t3 = mem->time3;
unlock_mutex(mutex);
...
while(t1 < t2 || t1 < t3){
lock_mutex(mutex);
t1 = mem->time1;
t2 = mem->time2;
t3 = mem->time3;
unlock_mutex(mutex);
}
}