Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++;结构物和挥发物 我有一些C代码,我希望能向C++过渡,作为第一步,我尝试用C++编译器(G++)来编译一些东西。_C++_Struct_Volatile - Fatal编程技术网

C++;结构物和挥发物 我有一些C代码,我希望能向C++过渡,作为第一步,我尝试用C++编译器(G++)来编译一些东西。

C++;结构物和挥发物 我有一些C代码,我希望能向C++过渡,作为第一步,我尝试用C++编译器(G++)来编译一些东西。,c++,struct,volatile,C++,Struct,Volatile,它为IPC使用一些共享内存段,指向这些段的指针声明为易失性: volatile my_rec_t *myRec; (其中my_rec_t只是一个普通的旧数据结构,myRec作为这些结构的数组进行访问) 我对数据结构的波动有一些问题:C++似乎需要比C更多的铸造,我不太清楚为什么…… 有一些自动生成的访问器函数用于获取/设置共享内存结构中的字段(目前所有的C样式代码)。这适用于基本数据类型,但如果my\u rec\t中的一个字段本身是结构,则会产生错误: int setIndexNode( in

它为IPC使用一些共享内存段,指向这些段的指针声明为易失性:

volatile my_rec_t *myRec;
(其中my_rec_t只是一个普通的旧数据结构,myRec作为这些结构的数组进行访问)

我对数据结构的波动有一些问题:C++似乎需要比C更多的铸造,我不太清楚为什么…… 有一些自动生成的访问器函数用于获取/设置共享内存结构中的字段(目前所有的C样式代码)。这适用于基本数据类型,但如果
my\u rec\t
中的一个字段本身是结构,则会产生错误:

int setIndexNode( int myRecNo, index_node_t indexNode )
{
  myRec[ myRecNo ].indexNode = indexNode;
  return TRUE;
}
在C++中,这会生成以下内容:<代码>错误:传递“ValuxNoDyt t和索引xNoDyt::this运算符”:“操作符=(const DexxNoDyt & &)”丢弃限定符。为了获得价值:

index_node_t getIndexNode( int myRecNo )
{
  return myRec[ myRecNo ].indexNode;
}
错误是
error:调用'index\u node\u t::index\u node\u t(volatile index\u node\u t&')时没有匹配的函数。

get问题对我来说更令人困惑,因为结构是按值传递的,所以返回值作为副本自然会失去它的波动性?对于设置的情况,在数据被另一个进程更改的情况下读取数据时,波动性无疑更为重要——我真的不知道在写入数据位置时,波动性意味着什么


注意:为了本例的目的,代码片段被缩减了,其中有各种各样的锁定和边界检查代码:)

对于
getIndexNode
来说,答案似乎相当简单:
const\u在返回它之前去掉波动性,因为这是您想要的语义。请注意,只要
volatile
指针指向的内存最初没有声明为
volatile
,就可以很好地定义将其丢弃


对于copy assignment操作符,您可以尝试将其设置为volatile,尽管您还没有显示足够的代码来确定这是否可以解决问题。例如
index\u node\u t&index\u node\u t::operator=(const index\u node\u t&)volatile

丢弃波动性永远都不安全;您只能使用标记为
volatile
的成员函数

然而,仅仅这样做并不能保证安全;这些操作可能是非原子的,因此线程开关可以重新调用它们。您还必须通过某种锁定机制或其他方式确保,当您使用这些易失性结构之一时,操作将在操作过程中完成,而结构的数据不会被其他内容更改


不在共享内存中使用这些结构可能会更容易,但使用一些可以通过操作系统函数原子地读写的数据块(如果存在这样的功能)。

相关:看起来您前面有一些样板文件:(另外,不要屈服于抛弃
volatile
的诱惑:
getIndexNode
是否真的打算提供一个时间点读取值,删除其
volatile
属性?@MarkB是的,它是从数据库复制的当前值。需要时锁定记录在别处处理。声明它
volatile
一开始可能(不一定)是错误的。
volatile
不是同步机制。丢弃volatile是未定义的行为: