In this chapter we shall learn about lock guard.
1. lock_guard is a class in C++
2. lock_guard provides RAII style mechanism for acquiring mutex for a scoped block.
3. lock_guard acquires mutex the moment you create an object of lock_guard.
4. When the control leaves the scope, it will automatically unlocks and lock_guard object is destroyed.
5. No need to explicit call unlock function.
6. You cannot copy lock_guard class.
Syntax for creating lock_guard is:
std::lock_guard<std::mutex> lock(m1);
Example of mutex without lock_guard [with simple mutex lock and unlock:]
#include <iostream>
#include <mutex>
#include <thread>
// for more tutorial in C++ visit www.prodevelopertutorial.com
using namespace std;
int count = 0;
std::mutex mu;
void incrementCount()
{
mu.lock();
count++;//critial section
cout<<count<<endl;
mu.unlock();
}
int main(void)
{
std::thread t1(incrementCount);
std::thread t2(incrementCount);
std::thread t3(incrementCount);
t1.join();
t2.join();
t3.join();
return 0;
}
Example of mutex with lock_guard:
#include <iostream>
#include <mutex>
#include <thread>
// for more tutorial in C++ visit www.prodevelopertutorial.com
using namespace std;
int count = 0;
std::mutex mu;
void incrementCount()
{
std::lock_guard<std::mutex> lock(mu); //lock_guard lock
count++;//critial section
cout<<count<<endl;
// see there is no explicit unlock.
}
int main(void)
{
std::thread t1(incrementCount);
std::thread t2(incrementCount);
std::thread t3(incrementCount);
t1.join();
t2.join();
t3.join();
return 0;
}