Coding
Concurrency

MPMC Queue

Premium
Difficulty

Asked at Jump Trading, Citadel Securities

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.

xxxxxx xxxxxx xxxxx xxx x xxxx-xxxx xxxxx xxxxx, xxxx xxxx xxx xxx xx xxxxx xxx xxxxxx xxxxxxxx: x xxxxxxx xxxxx-xxxxxxxx xxxxx-xxxxxxxx xxxxx xxxxx xxxx xxx xxxxx xxx xxx xxxxxxxxx xxxxxxxxx. xx xx xxx xxxxxxxxx xxxxxx xxxx xxxxx xxxxxxxx xxx xxx xxxxxxx, xx xx xxxx xxxx xxxx-xxxx xxxxxx xxxx xx xxxxxxxxxxx xxxxxxx, xxx xxxxxxx xxx xxxxxxxx xxx xxxxxxxx xxxxxxxxx xxxxxxx xxxxx xx xxxxxx xxxx xx xxxxx.

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

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

xxxxxxxxxxxx:

  • xxxxxx xxxx: xxxxxxxx xxx xxxxxxxxx xx xxx xxxxx xxxx xxxx xxxxxxxx. xxxx xxxxxxxx xxxxxxxxx xxxx xxxxxxx xxxx xxxxxxxx'x xxx xxxxx xxxxx xxx xxxxxxxxx xx xxxx xxxxxxxx'x xxxxxxxxxx xxxxx.
  • xxxxxxxx xxxxx xxxxxxxx xx x xxxxxxxxx xxxxxxxx xxxxxx x xxxxxxxxx xxxx. xxxx-xxxxxxx, xxxxx_xxx, xx xxxxx xxxxxxx xxx xxx xxxxxxxx xxxxxxx.
  • xxx xxx xxxxxxxxx xxxxxxxxx (xxx-xxxx xxx xxx-xxxxx). x xxxxxx xx "xxxxx" xxxx xxx xxx xxxxxxxxx xxxxxxxxx xxx xx xx xxxxx xxxxx.
  • xx xxxxxxx xxx xx xxxx xx xxxxxxxxxx, xxxxxxxxx xxxxxx xxxxxxxx.

xxxxxxxx

[]{
    xxxxxxxxx<xxxx xxxx> xxxxx(xxxx);
    xxx::xxxxxx<xxx::xxxxxx> xxxxxxxxx;
    xxx (xxx x = x; x < x; ++x) {
        xxxxxxxxx.xxxxxxx_xxxx([&xxxxx, x] {
            xxx (xxxx xxxx x = x; x < xxxxxx; ++x) xxxxx.xxxx(x * xxxxxxxxx + x);
        });
    }
    xxx::xxxxxx<xxxx xxxx> xxxxx{x}, xxx{x}, xxxxxxxxxx{x};
    xxx::xxxxxx<xxx::xxxxxx> xxxxxxxxx;
    xxx (xxx x = x; x < x; ++x) {
        xxxxxxxxx.xxxxxxx_xxxx([&xxxxx, &xxxxx, &xxx, &xxxxxxxxxx] {
            xxxx xxxx xxxxxxxx[x] = {-x, -x, -x};
            xxxx xxxx xxxxxxxxxx = x, xxxxxxxx = x, xxxxxxxxxxxxxxx = x;
            xxxxx (xxxx x = xxxxx.xxx()) {
                xxxxx xxxx xxxx xxxxxxxx = *x / xxxxxxxxx;
                xxxxx xxxx xxxx xxx = *x % xxxxxxxxx;
                xx (xxx <= xxxxxxxx[xxxxxxxx]) ++xxxxxxxxxxxxxxx;
                xxxxxxxx[xxxxxxxx] = xxx;
                ++xxxxxxxxxx;
                xxxxxxxx += *x;
            }
            xxxxx += xxxxxxxxxx; xxx += xxxxxxxx; xxxxxxxxxx += xxxxxxxxxxxxxxx;
        });
    }
    xxx (xxxx& x : xxxxxxxxx) x.xxxx();
    xxxxx.xxxxx();
    xxx (xxxx& x : xxxxxxxxx) x.xxxx();
    xxxxxx xxx::xxxxx<xxxx xxxx, xxxx xxxx, xxxx xxxx>(xxxxx.xxxx(), xxx.xxxx(), xxxxxxxxxx.xxxx());
}()
// (xxxxxx, xxxxxxxxxxxx, x)  (xxxxx xxxx xxxxxxxxx xxxx, xxx-xxxxxxxx xxxxx xxxxxx)

[]{ xxxxxxxxx<xxxx xxxx> xxxxx(x); xxx::xxxxxx<xxxx xxxx> xxx; xxx.xxxx_xxxx(xxxxx.xxxx(x)); xxx.xxxx_xxxx(xxxxx.xxxx(x)); xxx.xxxx_xxxx(xxxxx.xxxx(x)); xxx.xxxx_xxxx(xxxxx.xxx().xxxxx_xx(-x)); xxx.xxxx_xxxx(xxxxx.xxxx(xx)); xxx.xxxx_xxxx(xxxxx.xxx().xxxxx_xx(-x)); xxx.xxxx_xxxx(xxxxx.xxx().xxxxx_xx(-x)); xxx.xxxx_xxxx(xxxxx.xxx().xxxxx_xx(-x)); xxxxx.xxxxx(); xxx.xxxx_xxxx(xxxxx.xxxx(xx)); xxx.xxxx_xxxx(xxxxx.xxx().xxx_xxxxx()); xxxxxx xxx; }()
// [x, x, x, x, x, x, x, xx, x, x]  (xxxx; xxxx xxx xxx xxxxxx xxxxx xxxxx-xxx-xxxxx)

xxxxxxxxxxx

  • xx xx x xxxxxxxxx xxx x xxxxxxxxx; xx xx (x xxxxx xx^x) xxxxx xxx xxxx, xxxx xxx xxxxxx xxxx xx xxxxxxxx x xxxxx xxxxxx xxxxx xxxxxxxxx xxxxxx.
  • xxx xxxxxxx xx xx xxxxxxxxx xxxxxxxxx; x xxxxxxx xxxxxxxx'x xxx xxxx xx x xxxxx xxxxxxxx xx xxx xxxx xxxxx.
  • xxx-xxxxxxxx xxxxx xx xxxxxxx xx xxx xxxxxxxxx: xxx xxxx xxxxxxxx, xxx xxxxxxxx xxxxxxx xxx xxxxxx xxxxxxxx xxxxxxxx xxxx xxxx xxxxxxxx xxxx xx xxxxxxxx xxxxxxxxxx. xxxx xx x xxxxxxx xxxxx xxxxxx xxxx xxxx xxx-xx-x-xxxx xxxxxxxx; xx xxxx xxxxx xxxxxxxx xx, xxxx xxxxxxx xx xxxxxx.
  • xxx xxxxx xxxxxxxx xxxxxx, xxxx xxx xxxxx xxxxxxxxxx xxxxx xxx xxxxxxx xxxx. xx xxxxxx xxx x xxxxxx-xxxxxx xxx xxxx xxxx xxxxxxxxxx xxxxxxxxx xxxxxxxx xxx xx xxxxxxx; xxx xxxxxxxxxxxxxxx xxx x xxxx xx xxxxxx xxxx xxxxxxx xxxxxx xxx xxxxx xxx xxxxxx.

This problem is only available to subscribers.

Language: C++MpmcQueue
Sample tests

Unlock the problem to run it against the tests.