Skip to content

Latest commit

 

History

History
53 lines (41 loc) · 2.39 KB

C++并发编程基础:如何理解锁这个概念.md

File metadata and controls

53 lines (41 loc) · 2.39 KB

在C++并发编程中,“锁”是一个用于控制对共享资源访问的机制,以避免多个线程同时操作该资源而导致数据不一致或其他错误。理解锁的概念需要明确以下几个方面:

1. 锁是什么?

锁是一种同步机制,通常是一个对象(如 std::mutex),用于保护对共享资源的访问。当一个线程获得锁时,其他线程必须等待,直到该线程释放锁。

2. 锁住的对象是什么?

锁本身是一个对象(如 std::mutex),但它保护的是共享资源,通常是变量、数据结构或其他需要同步访问的资源。锁并不是直接“锁住”线程,而是锁住对资源的访问。

3. 锁资源(变量)还是锁线程?

  • 锁资源:锁的作用是保护资源,而不是线程。当一个线程锁定一个资源时,其他线程不能访问该资源,直到锁被释放。
  • 不锁线程:线程不会被锁住,而是被阻塞在获取锁的操作上,等待锁被释放。

4. 锁住代码块?

锁通常用于保护代码块,即临界区(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)。