// 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;
}