接上篇C++新特性31_利用C++自己封装线程同步锁(利用类的构造析构实现加锁解锁的自动化、利用引用实现在一个类中对另一个类的唯一对象的调用方法、利用对象及局部变量的作用域减小颗粒度),上篇介绍了自己利用C++完成线程同步锁的封装,C++11中STL采用和上篇一样的方式对上锁和解锁进行了封装
,本篇看C++11中STL提供了怎样的锁机制?
C++新特性32_C++中mutex与lock_guard的使用
1. C++提供的std::mutex上锁机制
类似于上篇我们自己利用C++将临界区方法
进行封装,在C++标准库中也对相关的Windows API进行了封装即std::mutex
。
#include <tchar.h>
#include <iostream>
#include <thread>
#include <mutex>
#include <windows.h>
#include "CMyMutex.h"
using namespace std;
int g_nData = 0;
// 创建临界区对象,等价于锁
std::mutex g_mtx;
void foo() {
{
g_mtx.lock();
for (int i = 0; i < 100000; i++) {
g_nData++;
}
g_mtx.unlock();
}
}
int _tmain(int argc, _TCHAR* argv[])
{
std::thread t(foo);
{
g_mtx.lock();
for (int i = 0; i < 100000; i++) {
g_nData++;
}
g_mtx.unlock();
}
t.join();
std::cout << g_nData << std::endl;
return 0;
}
运行结果:
2. C++提供的std::lock_guard自动上锁解锁机制
担心意外忘记解锁,为了实现上锁解锁的自动化,C++的标准库采用上篇相同的操作利用std::lock_guard<mutex>
实现
#include <tchar.h>
#include <iostream>
#include <thread>
#include <mutex>
#include <windows.h>
#include "CMyMutex.h"
using namespace std;
int g_nData = 0;
// 创建临界区对象,等价于锁
std::mutex g_mtx;
void foo() {
{
std::lock_guard<mutex> lg(g_mtx);
for (int i = 0; i < 100000; i++) {
g_nData++;
}
}
}
int _tmain(int argc, _TCHAR* argv[])
{
std::thread t(foo);
{
std::lock_guard<mutex> lg(g_mtx);
for (int i = 0; i < 100000; i++) {
g_nData++;
}
}
t.join();
std::cout << g_nData << std::endl;
return 0;
}
之前C++11写法是固定windows操作系统,但是C++从语法上实现了跨平台,在不同的系统中会自动调用相应的API实现线程的加锁解锁操作。
3.学习视频: C++中mutex与lock_guard的使用