C++11 并发指南之 Lock 详解
什么是 Lock
Lock 是一种同步机制,用于保护共享资源以避免并发访问。当多个线程访问同一个共享资源时,Lock 可以确保每个线程在使用共享资源时都是互斥的,从而避免竞态条件(Race Condition)和内存相关的不一致性问题。
Lock 的使用方法
C++11 中提供了两种 Lock 的实现方式:std::mutex
和 std::lock_guard
。
std::mutex
std::mutex
是 C++11 中用于实现 Lock 的最基本的互斥量类型。它的基本用法非常简单,如下所示:
#include <iostream>
#include <thread>
#include <mutex>
std::mutex mtx;
void print(int n) {
std::lock_guard<std::mutex> lock(mtx);
std::cout << "Thread " << n << std::endl;
}
int main() {
std::thread t1(print, 1);
std::thread t2(print, 2);
std::thread t3(print, 3);
t1.join();
t2.join();
t3.join();
}
运行上述代码,我们会发现输出结果是按照 1、2、3 的顺序打印出来的。这是因为使用 std::lock_guard
定义了一个互斥范围,只有持有锁的线程才能输出。其他线程在试图访问锁时将会被阻塞,只有当持有锁的线程抛弃锁的时候,其他线程才能开始访问共享资源。
std::lock_guard
std::lock_guard
是 std::mutex
类型的 RAII 包装器,它能够在构造函数中获取锁,在析构函数中释放锁。这种用法可以避免一些人为的错误,比如忘记释放锁。
#include <iostream>
#include <thread>
#include <mutex>
std::mutex mtx;
unsigned long long sum = 0;
void add(int n, int start, int end) {
for (int i = start; i < end; ++i) {
std::lock_guard<std::mutex> lock(mtx);
sum += i;
}
}
int main() {
std::thread t1(add, 1, 1, 50000000);
std::thread t2(add, 2, 50000000, 100000000);
t1.join();
t2.join();
std::cout << sum << std::endl;
}
上述代码定义了一个全局变量 sum
,然后定义了两个线程去修改它。我们使用了 std::lock_guard
来确保修改 sum
时是互斥的,避免了竞态条件(Race Condition)的问题。在两个线程都执行完毕后,输出最终的 sum
值。
结论
通过本文的介绍,我们可以看到,Lock 是一种非常重要的并发编程技术,能够保护共享资源以避免并发访问。在 C++11 中,我们可以使用 std::mutex
和 std::lock_guard
来实现锁,以保证线程安全。在使用 Lock 的过程中,一定要留意锁的粒度和生命周期,避免死锁等问题的发生。
参考资料
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++11 并发指南之Lock 详解 - Python技术站