在C++并发编程中,“锁”是一个用于控制对共享资源访问的机制,以避免多个线程同时操作该资源而导致数据不一致或其他错误。理解锁的概念需要明确以下几个方面:
锁是一种同步机制,通常是一个对象(如 std::mutex
),用于保护对共享资源的访问。当一个线程获得锁时,其他线程必须等待,直到该线程释放锁。
锁本身是一个对象(如 std::mutex
),但它保护的是共享资源,通常是变量、数据结构或其他需要同步访问的资源。锁并不是直接“锁住”线程,而是锁住对资源的访问。
- 锁资源:锁的作用是保护资源,而不是线程。当一个线程锁定一个资源时,其他线程不能访问该资源,直到锁被释放。
- 不锁线程:线程不会被锁住,而是被阻塞在获取锁的操作上,等待锁被释放。
锁通常用于保护代码块,即临界区(critical section)。这些代码块中包含对共享资源的访问和修改。通过将对共享资源的访问限制在被锁住的代码块内,可以确保一次只有一个线程执行该代码块。
#include <mutex>
#include <thread>
#include <iostream>
std::mutex mtx; // 互斥锁
int counter = 0;
void increment() {
for(int i = 0; i < 1000; i++) {
mtx.lock(); // 锁住 mtx
counter++;
mtx.unlock(); // 释放 mtx
}
}
int main() {
std::thread t1(increment);
std::thread t2(increment);
t1.join();
t2.join();
std::cout << "Counter: " << counter << std::endl;
return 0;
}
在这个例子中:
mtx
是一个互斥锁,用于保护对counter
的访问。mtx.lock()
和mtx.unlock()
之间的代码块是对counter
进行操作的临界区。- 每个线程在访问和修改
counter
时,必须先获得锁,从而确保同一时间只有一个线程可以修改counter
。
- 锁 是一种机制,用于保护对共享资源的访问。
- 锁住的对象 是共享资源(如变量或数据结构),而不是线程。
- 锁的作用 是确保一次只有一个线程可以执行特定的代码块(临界区),从而避免数据不一致和竞态条件(race condition)。