#include <iostream>
#include <vector>
#include <thread>
#include <functional>
#include <chrono>
#include <mutex>
std::mutex mtx; // LINE-1
class MessageQueue {
private:
int total_elems;
int n;
public:
MessageQueue() : total_elems(0) {}
void enqueue(int num_elems) {
std::lock_guard<std::mutex> lock(mtx); // LINE-2
n = num_elems;
int delay
= (int
)((double
)std
::rand() / (double
)(RAND_MAX
) * 10); std::this_thread::sleep_for(std::chrono::milliseconds(delay));
total_elems += n;
}
void dequeue(int num_elems) {
std::lock_guard<std::mutex> lock(mtx); // LINE-3
n = num_elems;
int delay
= (int
)((double
)std
::rand() / (double
)(RAND_MAX
) * 10); std::this_thread::sleep_for(std::chrono::milliseconds(delay));
total_elems -= n;
}
int getElemsCount() {
return total_elems;
}
};
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8dGhyZWFkPgojaW5jbHVkZSA8ZnVuY3Rpb25hbD4KI2luY2x1ZGUgPGNocm9ubz4KI2luY2x1ZGUgPG11dGV4PgpzdGQ6Om11dGV4IG10eDsgICAgLy8gTElORS0xCgpjbGFzcyBNZXNzYWdlUXVldWUgewpwcml2YXRlOgogICAgaW50IHRvdGFsX2VsZW1zOwogICAgaW50IG47CnB1YmxpYzoKICAgIE1lc3NhZ2VRdWV1ZSgpIDogdG90YWxfZWxlbXMoMCkge30KICAgIAogICAgdm9pZCBlbnF1ZXVlKGludCBudW1fZWxlbXMpIHsKICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtdHgpOyAgICAvLyBMSU5FLTIKICAgICAgICBuID0gbnVtX2VsZW1zOwogICAgICAgIGludCBkZWxheSA9IChpbnQpKChkb3VibGUpc3RkOjpyYW5kKCkgLyAoZG91YmxlKShSQU5EX01BWCkgKiAxMCk7CiAgICAgICAgc3RkOjp0aGlzX3RocmVhZDo6c2xlZXBfZm9yKHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMoZGVsYXkpKTsKICAgICAgICB0b3RhbF9lbGVtcyArPSBuOwogICAgfQogICAgCiAgICB2b2lkIGRlcXVldWUoaW50IG51bV9lbGVtcykgewogICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG10eCk7ICAgIC8vIExJTkUtMwogICAgICAgIG4gPSBudW1fZWxlbXM7CiAgICAgICAgaW50IGRlbGF5ID0gKGludCkoKGRvdWJsZSlzdGQ6OnJhbmQoKSAvIChkb3VibGUpKFJBTkRfTUFYKSAqIDEwKTsKICAgICAgICBzdGQ6OnRoaXNfdGhyZWFkOjpzbGVlcF9mb3Ioc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcyhkZWxheSkpOwogICAgICAgIHRvdGFsX2VsZW1zIC09IG47CiAgICB9CiAgICAKICAgIGludCBnZXRFbGVtc0NvdW50KCkgewogICAgICAgIHJldHVybiB0b3RhbF9lbGVtczsKICAgIH0KfTsK