Coding
Concurrency

SPSC Lock-Free Ring

Premium
Difficulty

Asked at Jump Trading, Hudson River 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.

xxx xxxxxx-xxxxxxxx xxxxxx-xxxxxxxx xxxx xx xxx xxxxxxxxx xxxx-xxxx xxxxxxxxx xx xxxxxxx xxxxxxxxxxxxxx: xxxxxxx xxx xxxxxx (xxx xxxx xxxxxxx) xxxxxx, xxxxxxx xxx xxxxxx (xxx xxxxxxxx) xxxx, xxx xxxxxxx xxxx xxxxx x xxxx xx xxxxx x xxxxxxx. xxx xxx-xxxxxx xxxxxxxxxxx xx xxxx xxxxx x xxxxxxx xxxxxxxxxxxxxx xxxxxxxxxx xxxx xxxx xxx xxxxxx xxxxxxx, xxx xxxxxxxxxxxx xxx xx xx xxxx xxx xxxxxxx xxx xxxxxxxx xxxxxxxxxx xxxxxxx/xxxxxxx xx xxxx xxxx xxxxxxxxx xxx::xxxxx.

xxxxxxxxx xxxxxxxx<x>, x xxxxxxx xxxx xxx xxx xxxxxxxx xxxxxx xxx xxx xxxxxxxx xxxxxx:

  • xxxxxxxx xxxxxxxx(xxx::xxxx_x xxxxxxxx): xxxxxxxxx xxx xxxxxxx xxxx, xxxx. xxx xxxx xxxx xx xxxx xx xxxx xxxxxxx xxxxxxxx xxxxxxxx. xxxxxxxx >= x.
  • xxxx xxx_xxxx(xxxxx x& xxxxx): xxxxxx xxxx xx xxx xxxxxxxx xxxxxx. xxxxxxx xxx xxxxxxx xxxx, xx xxxxxxx xxxxx xxxxxxx xxxx xxxxxxx xxxx xxx xxxx xx xxxx. xxxxx xxxxxx, xxxxx xxxxx.
  • xxx::xxxxxxxx<x> xxx_xxx(): xxxxxx xxxx xx xxx xxxxxxxx xxxxxx. xxxxxxx xxx xxxxxxx xxx xxxx, xx xxx::xxxxxxx xxxx xxxxx. xxxxx xxxxxx, xxxxx xxxxx.

xxxxx xx xxx xxxx:

  • xx xxxxx, xx xxxxxxxx, xx xxx xxxx. xxx xxxx xxxxxxxxxxxxxxx xxxxxxx xx xxx xxx::xxxxxx<xxx::xxxx_x> xxxxxxx (xxxx xxx xxxx) xxxx xxxxxx_xxxxx_xxxxxxx / xxxxxx_xxxxx_xxxxxxx (xxx xxxxxxx xxxxx x xxxxxx xxxxx xxx xxx xxxxx). xx xxx_xxx xxxxxxxxxx: xxx xxxxx xx xx xxxxx xxx xxxxxxx xxxxxxxxxx xxxxxxxxx xxxxxxxxxxxx.
  • xxxx xxxxx xx xxxxxxx xx xxxxxxx xxx xxxxxx: xxx xxxxxxxx xxxx xxx xxxx, xxx xxxxxxxx xxxx xxx xxxx.
  • xxxx xxxxx xxxx xxxx xxxxxxx: xxx xxxxxxxx xxxxxxxx xxxxxx xx xxx xxxxx xxxx xxxx xxxxxx, xxxx xxxxxxx xxxx, xxxxxxxxxx, xx xxxx.

xxxxxxxx

[]{ xxxxxxxx<xxx> xxxx(x); xxx::xxxxxx<xxx> xxx; xxx.xxxx_xxxx(xxxx.xxx_xxxx(x)); xxx.xxxx_xxxx(xxxx.xxx_xxxx(x)); xxx.xxxx_xxxx(xxxx.xxx_xxxx(x)); xxx.xxxx_xxxx(xxxx.xxx_xxx().xxxxx_xx(-x)); xxx.xxxx_xxxx(xxxx.xxx_xxxx(x)); xxx.xxxx_xxxx(xxxx.xxx_xxx().xxxxx_xx(-x)); xxx.xxxx_xxxx(xxxx.xxx_xxx().xxxxx_xx(-x)); xxx.xxxx_xxxx(xxxx.xxx_xxx().xxx_xxxxx()); xxxxxx xxx; }()
// [x, x, x, x, x, x, x, x]  (xxxx xxxxxxx, xxxx xxxxxxxxx xxxx)

[]{
    xxxxxxxx<xxxx xxxx> xxxx(xxxx);
    xxx::xxxxxx<xxxx> xxxx{xxxxx};
    xxx::xxxxxx<xxxx> xxxxxx{xxxxx};
    xxx::xxxxxx xxxxxxxx([&] {
        xxx (xxxx xxxx x = x; x < xxxxxx; ++x) {
            xxxx xxxx xxxxx = x;
            xxxxx (!xxxx.xxx_xxxx(x)) {
                xx (++xxxxx > xxxxxxxxx) { xxxxxx.xxxxx(xxxx); xxxx.xxxxx(xxxx); xxxxxx; }
                xxx::xxxx_xxxxxx::xxxxx();
            }
        }
        xxxx.xxxxx(xxxx);
    });
    xxxx xxxx xxxxx = x, xxx = x, xxxxxxxxxx = x, xxxx = x;
    xxxx xxxxxxx = [&](xxxx xxxx x) { xx (x != xxxx) ++xxxxxxxxxx; ++xxxx; ++xxxxx; xxx += x; };
    xxx::xxxxxx xxxxxxxx([&] {
        xxx (;;) {
            xx (xxxx x = xxxx.xxx_xxx()) { xxxxxxx(*x); }
            xxxx xx (xxxx.xxxx()) { xx (xxxx xxxx = xxxx.xxx_xxx()) xxxxxxx(*xxxx); xxxx xxxxx; }
            xxxx xxx::xxxx_xxxxxx::xxxxx();
        }
    });
    xxxxxxxx.xxxx();
    xxxxxxxx.xxxx();
    xxxxxx xxx::xxxxx<xxxx xxxx, xxxx xxxx, xxxx xxxx, xxxx>(xxxxx, xxx, xxxxxxxxxx, xxxxxx.xxxx());
}()
// (xxxxxx, xxxxxxxxxxxx, x, xxxxx)  (xxx xxxx xxxxxx, xx xxxxx, xxxx xxxx)

xxxxxxxxxxx

  • xxxxxxxx xx xx (x^{xx}); xxx xxxxxx xxxxx xxxx (x xxxxx xx^x) xxxxxxxxxx xxxxxx xxxxxxx xxx xxxx, xxxxxxxxx xxx xxx xx xxxxxxxx x xxxxx xxxxx xxxx xxx xxx xxxxxxxx xx xxx xxxx.
  • xxx xxxxxxxxxx (x(x)); xx xxxxxxxxxx xxxxx xxx xxxxxxxxxxx.
  • xxx xxxxxx xxxxxxx xxxxx xxxxx xxxxx xxxxx xxxx xx xxxx x xxxxxx xxxx xxxxx xxxx xxxxxxx xx xxxxxxx; x xxxxxxx xxxx xxxxx xxxxx xxxx xxx xxxxx.
  • xxx xxxxx xxxxxxxx xxxxxxxxxx xxxxxxxxx xxxxx xxxxxxxxxx: xxxxxx, xxxx xxx xxxxx xxxxxxxxxx xxxxx xxxx xxxxxxx xxxx, xxxxx xxx xxxxxxxxx xxxxx xxxxxxxxxxxxx. xxxxxxx xxxx xxx xxxxx xxxx xxxxxx xxxxxx xxx xxxxxxx xx xxxx xxxxxxx xx xxxxxx xxxxxxxx; xxx xxxxxxxxxxxxxxx xxxxxxx xxx xxxx (xxx xxx xxxxxxxxx).

This problem is only available to subscribers.

Language: C++SpscRing
Sample tests

Unlock the problem to run it against the tests.

Next in Quant Dev 50MPMC Queue