我有一个1024个地址的内存地址池。程序内部有16个线程,它们访问这些内存位置进行读或写操作。这个程序的输出是一系列四重的形式,其defn就像这样
四倍q1 :(线程号,内存地址,读/写,时间)
例如q1 =(12,578,r,2t),q2 =(16,578,w,6t)
我想设计一个程序,它将四倍流作为输入,并报告如果超过2个线程尝试在5t秒的间隔内访问相同的内存资源且至少有一次写入操作,则会发生所有冲突。
我有几个解决方案,但我不确定它们是否是解决此问题的最佳解决方案。我正在寻找从设计和数据结构角度来看的解决方案。
答案 0 :(得分:1)
所以这里的基本问题是碰撞检测。我通常会寻找一种解决方案,其中元素被添加到某种关联集合中。由于即将添加一个新元素,您需要能够判断该集合是否已包含类似的元素,表明存在冲突。在这里,您似乎需要一个允许重复元素的集合类型,例如STL multimap。 Quadraple(四倍?)显然是关联集合中的值类型,密钥类型将包含确定两个元素是否表示冲突所必需的数据,即内存地址和时间。为了使用像STL multimap这样的标准关联集合,您需要通过定义operator<来定义键上的一些排序。对于密钥类型(我在这里假设C ++,你没有指定)。您将碰撞定义为两个元素,其中内存位置相同且时间值相差小于某个阈值量。密钥类型的排序必须使得表示冲突的两个密钥在排序下等同。 <等价运算符表示为< b是假的,b
bool operator<( Key const& a, Key const& b ) {
if ( a.address == b.address ) {
if ( abs(a.time - b.time) < threshold ) {
return false;
}
return a.time < b.time;
}
return a.address < b.address;
}
这种设计存在一个问题,因为两个键在&lt;不平等。这意味着两个不同但相似的Quadraples,即两个彼此冲突的值,将存储在集合中的相同键下。您可以使用更简单的排序定义
bool operator<( Key const& a, Key const& b ) {
if ( a.address == b.address ) {
return a.time < b.time;
}
return a.address < b.address;
}
在此排序定义下,碰撞元素最终在有序关联容器中相邻(但在不同的键下),因此您可以在将它们全部添加到集合后,在后处理步骤中轻松找到它们