设计用于报告资源冲突的数据结构

时间:2011-03-14 11:50:22

标签: multithreading design-patterns data-structures

我有一个1024个地址的内存地址池。程序内部有16个线程,它们访问这些内存位置进行读或写操作。这个程序的输出是一系列四重的形式,其defn就像这样

四倍q1 :(线程号,内存地址,读/写,时间)

例如q1 =(12,578,r,2t),q2 =(16,578,w,6t)

我想设计一个程序,它将四倍流作为输入,并报告如果超过2个线程尝试在5t秒的间隔内访问相同的内存资源且至少有一次写入操作,则会发生所有冲突。

我有几个解决方案,但我不确定它们是否是解决此问题的最佳解决方案。我正在寻找从设计和数据结构角度来看的解决方案。

1 个答案:

答案 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;
}

在此排序定义下,碰撞元素最终在有序关联容器中相邻(但在不同的键下),因此您可以在将它们全部添加到集合后,在后处理步骤中轻松找到它们