更新题目 Buddy Bitmap:区间置位清位
题目 everpure-bitset · 修改(rev 10) · · 2026-10-26 00:29
body
@@ -475,5 +475,5 @@ ### 2. 多个线程同时调用 -先说结论:不加锁会写出违反不变式的树,最简单可靠的修法是整个 `set_bits` / `clear_bits` 调用拿同一把锁。锁(lock)的含义:同一时刻只有一个线程能拿着它,其他想拿的线程停下来等。Python 里的用法见 [[p:me/python-concurrency]]。 +先说结论:不加锁会写出违反不变式的树,最简单可靠的修法是整个 `set_bits` / `clear_bits` 调用拿同一把锁。锁(lock)的含义:同一时刻只有一个线程能拿着它,其他想拿的线程停下来等。Python 里的用法见 [[p:kb/python-concurrency]]。 不加锁会坏,是因为 `set_bits` 在一层里先读 buddy、再决定要不要写父节点,这是两步。另一个线程的 `clear_bits` 可以插在这两步之间把 buddy 清掉。具体例子:4 个叶子 `1 1 1 0`,第 1 层是 `1 0`,根是 `0`。线程 A 调 `set_bits(3, 1)`,线程 B 调 `clear_bits(2, 1)`。