Get Mystery Box with random crypto!

Да, в коде выше есть баг, а именно Unsigned Overflow. В одн | 0x1337

Да, в коде выше есть баг, а именно Unsigned Overflow.

В однопоточном варианте этот баг себя никак не проявит: ожидаемо, функция get_current_time_ns будет выдавать значения не меньше значений полученных при предыдущих её вызовах, и каждое из этих значений будет записано в поле prev_time, объекта elem, после чего разность curr_time и prev_time будет посчитана без каких-либо проблем. В многопоточном же сценарии все не так радужно и баг дает о себе знать:

Пусть у нас есть два потока и оба вошли в заданную функцию. При этом до блокировки каждый из них получил результат функции get_current_time_ns: 0 и 1 соответственно. Пусть в блокировку входит поток у которого значение данной функции - единица(обозначу его как A), а поток с значением 0, ожидает разблокировки(обозначу его как B). В итоге, поток A при выполнении присвоит elem->prev_time единицу и даст старт потоку B, который, имея значение curr_time = 0, выполнит вычитание: 0 - 1->unsigned overflow.

@ioann_V для связи.

#multithreading #sync #cxx