有点晚了,但供将来参考。使用原子操作,可以构建不相交的集合数据结构。不变量是每个集合都由其最小成员表示,这样可以避免由于竞争条件而导致的循环。
static unsigned int GetSet(volatile unsigned int *H_RESTRICT set, const unsigned int v)
{
unsigned int next;
unsigned int root = v;
unsigned int prev = v;
while (root != (next = set[root]))
{
atomic_compare_and_exchange(set + prev, next, root);
prev = root;
root = next;
}
return root;
}
static HBOOL IsInSameSet(volatile unsigned int *H_RESTRICT set, unsigned int v1, unsigned int v2)
{
do
{
v1 = GetSet(set, v1);
v2 = GetSet(set, v2);
} while (set[v1] != v1 || set[v2] != v2);
return v1 == v2;
}
static void Union(volatile unsigned int *H_RESTRICT set, unsigned int v1, unsigned int v2)
{
unsigned int result;
do
{
v1 = GetSet(set, v1);
v2 = GetSet(set, v2);
if (v1 == v2)
{
break;
}
if (v1 < v2)
{
unsigned int tmp = v1;
v1 = v2;
v2 = tmp;
}
result = atomic_compare_and_exchange(set + v1, v2, v1);
} while (result != v1);
}