【发布时间】:2014-09-19 09:38:53
【问题描述】:
我想实现以下支持以下操作的原子对象:
inc_and_get(X) - increment the counter and return the previous value
dec(X) - decrement the counter
inc_and_disable_if_zero (x) - increment the counter, but if the value is zero, disable it
disable means it returns -1 for every operation
inc_and_get(X) 和 dec(X) 可以使用基本硬件原语实现
我感兴趣的是:
inc_and_disable_if_zero
递增对应进入临界区,递减对应离开。
进入临界区的线程可以决定定期进入(通过执行inc_and_get)或尝试进入并在可能的情况下通过调用inc_and_disable_if_zero(没有其他人)禁用计数器
我认为可以用 CAS(X) 解决这个问题:
inc_and_disable_if_zero(X)
do {
value = READ(X)
if (value == 0) {
next_value = -1;
disable = TRUE;
} else if (value > 0) {
next_value = value + 1; // no good, :( , just increment
disable = FALSE;
} else {
return (TRUE); // someone else disabled it
}
} while (!CAS(value, next_value));
return (disable);
但我想知道是否有更优雅的方法来解决这个问题(使用一个整洁的原子 操作)?
例如,如果计数器为零,则递增并设置 MSB ?
【问题讨论】:
标签: c multithreading concurrency atomic