C++ 11 to 20: Dead lock prevention using std::lock

C++ 11 really makes coding C++ much easier than before. One of the feature that I demonstrated in this video is dead lock prevention using std::lock. Hope this is helpful.

Youtube Video: C++ 11 to 20: Dead lock prevention using std::lock

Source code used in the video:

C++:
// Youtube video: https://youtu.be/71qO7ybwlUA
#include <iostream>
#include <mutex>
#include <thread>

using namespace std::chrono_literals;

class mutexdead1 {
    std::mutex mut1;
    std::mutex mut2;

   public:
    void accessor1() {
        // std::lock_guard lock1(mut1); // could cause deadlock
        // std::lock_guard lock2(mut2);
        std::lock(mut1, mut2);
        std::lock_guard lock1(mut1, std::adopt_lock);
        std::lock_guard lock2(mut2, std::adopt_lock);
        std::cout << "accessor1" << std::endl;
    }

    void accessor2() {
        // std::lock_guard lock1(mut1); // could cause deadlock
        // std::lock_guard lock2(mut2);
        std::lock(mut2, mut1);
        std::lock_guard lock2(mut2, std::adopt_lock);
        std::lock_guard lock1(mut1, std::adopt_lock);

        std::cout << "accessor2" << std::endl;
    }
};

void thread1(std::shared_ptr<mutexdead1> p) {
    for (int i : {1, 2, 3, 4, 5, 6}) {
        std::this_thread::sleep_for(2000ms - std::chrono::milliseconds(i));
        p->accessor1();
    }
}

void thread2(std::shared_ptr<mutexdead1> p) {
    for (int i : {1, 1, 1, 1, 1, 1}) {
        std::this_thread::sleep_for(2000ms - std::chrono::milliseconds(i));
        p->accessor2();
    }
}

int main() {
    auto p = std::make_shared<mutexdead1>();
    std::thread t1(thread1, p);
    std::thread t2(thread2, p);
    t1.join();
    t2.join();
}
 
Top