我有一堆线程和一堆计数器。线程递减计数器,如果计数器达到零,就会发生有趣的事情。使用原子操作实现这一点很简单。
但是,如果我们需要两个属性来保持而不考虑线程或计数器的数量,这将变得更加困难:
- 可扩展性:递减一个计数器是 O(polylog)。
- 紧凑性:每个计数器的内存为 O(1)。
我知道如何单独执行其中任何一项:简单的实现是紧凑的,分层计数网络 [4] 是可扩展的)。有可能两者都做吗?
注意:由于 O(n) 个线程不能在 O(n) 时间内做出 O(n) 个不同的更改 O(1) 个内存,因此解决此问题需要在不同计数器之间共享数据结构。
[4]:J. Aspnes、M. Herlily 和 N. Shavit。计数网络。ACM 杂志,41(5):1020-1048,1994 年 9 月。
更新:Jed Brown 指出了一个明显的事实,即 O(1) 时间是不可能的。更改为多对数。