Concurrency

Atomic Counter Without a Mutex

Premium
Difficulty

Asked at XTX Markets, Jump Trading

Theory: Concurrency From Scratch

Read the problem, hints and solution here. The editor needs a bigger screen: open this page on a laptop to write and run your code.

xxxxxxxxx xxxxxxxxxxxxxx, x xxxxxxx xxxx xxxx xxxxxxx xxxxxxxxx xx xxxx xxxx xx xxxxx. xx xxxxxx xxx xxxxx xxxx xxxxxxx xxxxxx, xxxx xx xxx xxx xxxxx xxxx, xxx xxxx xxx xxxxxx xx xxxx.

x xxxxxxx-xxxx xxxxxxx xxxx xx xxx xxx xxxx xx x xxxx xxxxxxx: xxxxx xxxxxx xxxxxxxxxx xx, xxx x xxxxxxxxxx xxxxxx xxxxx xx xxxx x xxxxxx. x xxxxx xxxxxx x xxxx xxxx xxxxxxxxxx xxx xxxxxx xxxx. x xxxxxx xxx::xxxxxx<xxxx xxxx> xx xxxxxx xx xxx: xxxxx xxxx xxxx xxxxxxxxxx xxxxx xxx xxxx xxxxx xxxx xxxx xxxx xxxxx xxxxx xxxx. xxxxxxxx xxxxxx xxxx. xxxx xxxxxx xxx xxx xxx xxxxxx xxxxx, xxx xxx xxxxxx xxxx xxx xxxx xx xxxxxxx xxxx.

xxx xxxxxxxxx:

  • xxxxxxxx xxxxxxxxxxxxxx(xxx::xxxx_x xxxxxxxxxx): xxxxxxx xxxxxxxxxx xxxxxxxxxxx xxxxxx, xxxx xxxxxxxxxxx xx xxxx. xxxxxxxxxx >= x.
  • xxxx xxxxxxxxx(xxx::xxxx_x xxxxxxxxx): xxxx x xx xxxxx xxxxxxxxx % xxxxxxxxxx xxxx x xxxxxxx xxxxxx xxx (xxx::xxxxxx_xxxxx_xxxxxxx). xxxxxxx xxxx x xxxxxx xxx-xxxxxx xxxx xx xxxxxxxxx xxxxxxx xxxx xx xxxxxxxxx xxxxxx. xxxx xx xxxx xxxx xxx xxxxxx xx xxxxxxx xxxxxxxxxxxx, xxxx xx xxxxx xxx xx xxx xxxx.
  • xxxx xxxx xxxx() xxxxx: xxx xx xxx xxxxxx. xxxxx xxxxxxxxxx xxx xx xxxxxx xxxx xx x xxxxx xxxxxxxx xxxxx xxxxx (xxxxxxxxxx xxxxxxxxxx); xxxxx xxx xxxxxxxxxxxx xxxxxxx xxx xxxxxx xx xxxx xx xxxxx.
  • xxx::xxxxxx<xxxx xxxx> xxxxxxxxxxx() xxxxx: xxx xxx-xxxxx xxxxxx, xx xxxxx xxxxx. xxxx xxxxxxxxxxx xxxxxxxx xx xxxx().

xxxx xxxxx xxxx xxxx xx xxx xxx xxxxx xxxx (xxxxxxx(xx)), xx xxx xxxxxxxx xx xxxxxxxx: xxxxxx xxxx xxxxx x xxxx xxxxx xxxx-xxxx xxxxxxx xxxx x xxxxxx xxxxxx. xxxx xxxx xxx::xxxxxx xx xxxxxxx xxxxxxxx xxx xxxxxxx, xx xxx::xxxxxx<xxx::xxxxxx<xxxx xxxx>> xxxx xxx xxxxxxx xxxx x xxxxxxxxx xxxxxx; xxxx xxxxxxx xxxx xx xxxxx xxxx.

xxxxxxxx

[]{
    xxxxxxxxxxxxxx xxxxxxx(x);
    xxx::xxxxxx<xxx::xxxxxx> xxxxxxx;
    xxx (xxx x = x; x < x; ++x) {
        xxxxxxx.xxxxxxx_xxxx([&xxxxxxx, x] {
            xxx (xxx x = x; x < xxxxxx; ++x) xxxxxxx.xxxxxxxxx(xxxxxx_xxxx<xxx::xxxx_x>(x));
        });
    }
    xxx (xxxx& xx : xxxxxxx) xx.xxxx();
    xxxxxx xxxxxxx.xxxx();
}()
// xxxxxxx  (xxxxxxx xxxx, xxx xxxxx xxxxx xxxx: xx xxxxxx xxxx)

[]{ xxxxxxxxxxxxxx xxxxxxx(x); xxx (xxx x = x; x < xx; ++x) xxxxxxx.xxxxxxxxx(xxxxxx_xxxx<xxx::xxxx_x>(x)); xxx::xxxxxx<xxxx xxxx> xxxxxx = xxxxxxx.xxxxxxxxxxx(); xxx::xxxx(xxxxxx.xxxxx(), xxxxxx.xxx()); xxxxxx xxx::xxxxx<xxxx xxxx, xxxx xxxx, xxx::xxxxxx<xxxx xxxx>>(xxxxxxx.xxxx(), xxxxxx_xxxx<xxxx xxxx>(xxxxxx.xxxx()), xxxxxx); }()
// (xx, x, [x, x, x, x])  (xxxxx x..x xxxx x xxxxxx xxx xxxxxx)

xxxxxxxxxxx

  • xxxxxxxxxx xxxxxxx x xxx xx; xx xx x xxxxxxx xxx (x.x xxxxx xx^x) xxxxxxxxxx xxx xxxx.
  • xxxxxxxxx xxxx xx xxxx-xxxx xxx xxxx-xxxx: xxx xxxxxxx xxxxx_xxx, xx xxxxx, xx xxx xxxxx xxxx, xx xxxxxx-xxxxx xxxxxxxxxxxx xxxxxxx.
  • xxxxxxxxx xxxxx xxxxxxxxxx xx xxx-xxxxxxxxxx: xxxxx xxxx xxx xxxxxx x xxxxxxx-xxxxxx xxxx xxxx xxxxx xxxxxxxxx, xx xxxxxxx xxxxxxxx xxxxx xxxxxxx xxxx xxxxxxx xxx xxxxxx. xxx xxxxx xxxxx xxxxx xxxxxx xxx xxxxx xxx-xxxxx xxxxxx xxxxx xxxx.
  • xxx xxxxx xxx xxxxxx xxxxxx, xxx xxxxx xxxxxxx: xx xxxxxx xxxx xxxxxx xxxxxx xxxx xxxxx-xxxxxx xxxx. xxx xxxxxxxxx xxxxxx xxx xxx xxxxx xxxxxxx xxxx; xx xxxxxxxxxxx xxxx xxx.

This problem is only available to subscribers.

Language: C++23StripedCounter

Unlock the problem to run it against the tests.