// std::lock example
#include <iostream>       // std::cout
#include <thread>         // std::thread
#include <mutex>          // std::mutex

std::mutex m1;

// does not compile - lock_guard is not copiable
//std::lock_guard<std::mutex> getLock() {
//    std::lock_guard<std::mutex> ret(m1);
//    return ret;
//}

int main()
{
    //3 lines below do not compile
    //std::lock_guard<std::mutex> my_lock(m1);
    //my_lock.unlock();// class std::lock_guard<std::mutex>’ has no member named unlock
    //my_lock.lock();  // class std::lock_guard<std::mutex>’ has no member named lock

    // unique_lock may locked and unlocked multiple times
    std::unique_lock<std::mutex> my_lock( m1 ); // locked by default
    // critical code
    my_lock.unlock();
    // concurrent code
    my_lock.lock();
    // critical code
    return 0;
}