有人在此站点上发布了两个线程的简单互斥算法。
bool locks[2];
thread_function() {
bool id = get_id();
while(1) {
if (!tset(&locks[id])) {
if (!tset(&locks[!id])) {
x++; // critical section
break;
}
else locks[id] = false;
}
}
locks[id] = false;
locks[!id] = false;
}
对于 Thread0get_id()
返回false
,对于 Thread1 它返回true
。这tset()
是一个原子测试和设置函数,它将其参数的值设置为true
并返回前一个值。
在被作者删帖之前,对于这个算法是否没有竞态条件或者死锁的问题,不同的用户给出了不同的答案。
如何分析这个算法?