【发布时间】:2015-04-27 02:42:32
【问题描述】:
我正在开发一个使用组合树概念的共享计数器增量应用程序。我的目标是让这个应用程序在 2^n 个内核上工作,例如 4、8、16、32 等。这个算法可能会在任何线程故障时出错。假设不会出现线程故障或非常慢的线程。
- 两个线程在叶节点处竞争,到达的后一个线程沿树向上。
- 到达的第一个等待,直到第二个到达层次结构并返回正确的返回值。
- 第二个线程唤醒第一个线程
- 每个线程都获得正确的 fetchAndAdd 值
但是这个算法有时会被锁定在 while (nodes[index].isActive == 1) 或 while(nodes[index].waiting == 1) 循环中。我看不到任何死锁的可能性,因为每个节点只有两个线程在竞争。各位大神能帮我解答一下这个问题吗?
int increment(int threadId, int index, int value) {
int lastValue = __sync_fetch_and_add(&nodes[index].firstValue, value);
if (index == 0) return lastValue;
while (nodes[index].isActive == 1) {
}
if (lastValue == 0) {
while(nodes[index].waiting == 1) {
}
nodes[index].waiting = 1;
nodes[lindex].isActive = 0;
} else {
nodes[index].isActive = 1;
nodes[index].result = increment(threadId, (index - 1)/2, nodes[index].firstValue);
nodes[index].firstValue = 0;
nodes[index].waiting = 0;
}
return nodes[index].result + lastValue;
}
【问题讨论】:
标签: multithreading algorithm counter