C++ 锁
在多线程编程中,当多个线程同时访问共享资源时,可能会导致数据竞争(Data Race),产生不可预期的结果。锁提供了同步机制,确保在同一时间只有一个线程可以访问临界区。锁的本质是通过互斥机制(Mutual Exclusion)确保:
[*]同一时间只有一个线程能进入访问共享资源的代码段(临界区);
[*]线程对共享资源的修改能被其他线程立即可见(避免 CPU 缓存导致的数据不一致)。
1、标准库锁类型
C++11 及后续标准在头文件中提供了多种锁类型,满足不同场景需求。
1.1 std::mutex:基础互斥锁
std::mutex是最基础的互斥锁,提供独占所有权 —— 同一时间仅允许一个线程锁定,其他线程尝试锁定时会阻塞等待,直到锁被释放。
核心操作:
[*]lock():锁定互斥锁(若已被锁定,当前线程阻塞);
[*]unlock():解锁互斥锁(必须由持有锁的线程调用,否则行为未定义);
[*]try_lock():尝试锁定(成功返回true,失败返回false,不阻塞)。
基础用法(手动加锁 / 解锁)
#include #include #include std::mutex mtx; // 全局互斥锁int shared_value = 0;// 线程函数:对共享变量累加void increment() { for (int i = 0; i < 10000; ++i) { mtx.lock(); // 手动加锁 shared_value++; // 临界区:安全修改共享资源 mtx.unlock(); // 手动解锁(必须执行,否则死锁) }}int main() { std::thread t1(increment); std::thread t2(increment); t1.join(); t2.join(); std::cout
页:
[1]