#include <thread>
#include <mutex>
#include <iostream>
#include <chrono>
std::mutex m1,m2;
void foo() {
m1.lock();
std::cout<<"foo locked m1"<<std::endl;
std::this_thread::sleep_for (std::chrono::seconds(1));
m2.lock();
m1.unlock();
std::cout<<"foo locked m2 and releases m1"<<std::endl;
m2.unlock();
std::cout<<"foo is ok"<<std::endl;
}
void bar() {
m2.lock();
std::cout<<"bar locked m2"<<std::endl;
std::this_thread::sleep_for (std::chrono::seconds(1));
m1.lock();
m2.unlock();
std::cout<<"barlocked m1 and releases m2"<<std::endl;
m1.unlock();
std::cout<<"bar is ok"<<std::endl;
}
int main()
{
std::thread t1(foo);
bar();
t1.join();
std::cout << "Everything went fine"<<std::endl;
return 0;
}
CiNpbmNsdWRlIDx0aHJlYWQ+CiNpbmNsdWRlIDxtdXRleD4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y2hyb25vPgpzdGQ6Om11dGV4IG0xLG0yOwp2b2lkIGZvbygpIHsKICBtMS5sb2NrKCk7CiAgc3RkOjpjb3V0PDwiZm9vIGxvY2tlZCBtMSI8PHN0ZDo6ZW5kbDsKICBzdGQ6OnRoaXNfdGhyZWFkOjpzbGVlcF9mb3IgKHN0ZDo6Y2hyb25vOjpzZWNvbmRzKDEpKTsKICBtMi5sb2NrKCk7CiAgbTEudW5sb2NrKCk7IAogIHN0ZDo6Y291dDw8ImZvbyBsb2NrZWQgbTIgYW5kIHJlbGVhc2VzIG0xIjw8c3RkOjplbmRsOwogIG0yLnVubG9jaygpOyAKICBzdGQ6OmNvdXQ8PCJmb28gaXMgb2siPDxzdGQ6OmVuZGw7Cn0Kdm9pZCBiYXIoKSB7CiAgbTIubG9jaygpOwogIHN0ZDo6Y291dDw8ImJhciBsb2NrZWQgbTIiPDxzdGQ6OmVuZGw7CiAgc3RkOjp0aGlzX3RocmVhZDo6c2xlZXBfZm9yIChzdGQ6OmNocm9ubzo6c2Vjb25kcygxKSk7CiAgbTEubG9jaygpOwogIG0yLnVubG9jaygpOyAKICBzdGQ6OmNvdXQ8PCJiYXJsb2NrZWQgbTEgYW5kIHJlbGVhc2VzIG0yIjw8c3RkOjplbmRsOwogIG0xLnVubG9jaygpOyAKICBzdGQ6OmNvdXQ8PCJiYXIgaXMgb2siPDxzdGQ6OmVuZGw7Cn0KaW50IG1haW4oKQp7CiAgIHN0ZDo6dGhyZWFkIHQxKGZvbyk7IAogICBiYXIoKTsgCiAgIHQxLmpvaW4oKTsgCiAgIHN0ZDo6Y291dCA8PCAiRXZlcnl0aGluZyB3ZW50IGZpbmUiPDxzdGQ6OmVuZGw7IAogICByZXR1cm4gMDsgIAp9