我的知识还差一点。我有三个进程通过共享内存段进行通信。并发访问是通过正确锁定(以避免在这里被误解)处理的,因此,我敢肯定,我正在按照预期的方式使用volatile关键字。我的共享内存段被强制转换为结构的 Volatile 指针,我可以对此进行操作。该结构必须是 Volatile 的,因为有时我需要旋转直到共享内存上的某些值发生变化-因此不选择不使用 Volatile 是不可行的。现在,我正在使用一个外部C++库(SystemC,但这在此应该无关紧要),我的结构包含该库的sc_time成员。尽管我可以访问该库的源代码,但是我不想依赖于我所做的修改,可能会破坏内容或进入维护 hell 。现在,此类“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); }} 最佳答案 如果必须旋转以等待变量的更改,那么不是正确锁定。自旋等待始终必须假定原子访问数据。这不仅与获取最新版本的数据有关,还与一致性有关,例如,数据可能会拆分到多个缓存行中,并且您可能只获得旧版本的低字节和更新版本的高字节。因此,新的C和C++标准具有用于原子访问的概念和工具,请尽可能使用它们。如果您没有它们,请使用编译器(或库)扩展:所有现代处理器都具有原子指令,任何体面的编译器都具有提供此类功能的扩展。使用volatile玩游戏不是您应该走的路。如果丢弃volatile并将此类对象传递给不希望其下发生任何更改的函数,则所有事情都会发生。特别是,当编译不包含volatile的库时,可能会执行破坏数据的优化。不要这样 编辑:由于您还用gcc标记了问题,因此有充分的理由,他们从一开始就将__sync_lock_test_and_set内置为扩展。用它。也许在您特定的体系结构组合上,它可以用完全相同的代码解决,但是请相信gcc专家,他们知道何时必须添加一些汇编魔术师才能为您提供有关数据的保证。关于c++ - 将 volatile 数据与不重载 volatile 数据的方法一起使用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18506653/
10-10 15:04