【问题标题】:how to check for an array update如何检查数组更新
【发布时间】:2010-11-26 22:40:40
【问题描述】:

我的程序中有一些数据类型(int、string 甚至用户定义的类对象)的数组和几个线程。我希望能够找到在使用某些值初始化后数组是否已更新。一个想法是关联数组中值的散列,每当我想检查数组是否已更新时,重新计算散列。在 c++ 中还有其他方法吗?或者我们可以检查自上次检查以来内存地址范围是否已更新?

谢谢

【问题讨论】:

  • 这取决于很多事情.. 1)您是否有权访问修改它的代码?如果不是,那么 2) 它的修改频率如何,您希望多久执行一次这些检查以及它有多大?哦,你为什么需要它?

标签: c++ arrays memory


【解决方案1】:

您可以将数组封装在一个类模板中,该模板为您需要的任何读写操作提供外观,并在数组更新时标记dirty - 在每次检查时重置dirty 标志。

不确定如何在多个读取器/写入器线程之间实现可靠,但我想这取决于访问模式和您想要的确切语义。

[哈希不起作用,因为哈希总是会发生冲突。]

【讨论】:

  • 更复杂的解决方案将允许相关方(观察者)注册回调,以便对数组数据(Observable)的每次更改都会立即通知(观察者模式)。但这似乎有点过头了,从这里有限的信息很难说。
  • 谢谢,我会尝试实现这个。
【解决方案2】:

哈希方法仅在您不关心对象被修改但随后重置为其初始值的情况下才有效。在这种情况下,对象已“更新”,但无法使用哈希来判断。

另一种方法是使用更新计数器:在对象旁边保留一个整数,并在每次更新时递增它。

【讨论】:

  • 我对正在修改的对象很好,但重置回原来的状态。 Wat 将是一个很好的散列函数,它可以处理所有可能的数据类型......一个模板化的散列函数?此外,更新计数器不适用于字符串、整数等。
  • @user352951:你不能写“一个好的散列函数[用于]所有可能的数据类型”......至少你需要一些指示哪些位参与逻辑值 - 即忽略填充和(可能是可变的)缓存数据等。您还需要对等价做出一些决定(即对于某些数据类型,可能存在相同逻辑值的多个表示,或者您可能需要 - 出于您的目的 - 考虑一些等效的逻辑值(例如 +0 和 -0)。
猜你喜欢
  • 2023-03-28
  • 1970-01-01
  • 2022-11-23
  • 2015-11-12
  • 1970-01-01
  • 2020-05-09
  • 2021-02-05
  • 1970-01-01
  • 2014-04-15
相关资源
最近更新 更多