C++ 标准库 <mutex>

在多线程编程中,确保数据的一致性和线程安全是至关重要的。

C++ 标准库提供了一套丰富的同步原语,用于控制对共享资源的访问。

C++ 标准库中的 <mutex> 头文件提供了一组工具,用于在多线程程序中实现线程间的同步和互斥。

<mutex> 头文件是 C++11 引入的,它包含了用于互斥锁(mutex)的类和函数。互斥锁是一种同步机制,用于防止多个线程同时访问共享资源。

互斥锁(Mutex)是一个用于控制对共享资源访问的同步原语。当一个线程需要访问共享资源时,它会尝试锁定互斥锁。如果互斥锁已经被其他线程锁定,请求线程将被阻塞,直到互斥锁被释放。

基本语法

在 C++ 中,<mutex> 头文件提供了以下主要类:

  • std::mutex:基本的互斥锁。
  • std::recursive_mutex:递归互斥锁,允许同一个线程多次锁定。
  • std::timed_mutex:具有超时功能的互斥锁。
  • std::recursive_timed_mutex:具有超时功能的递归互斥锁。

实例

1. 使用 std::mutex

下面是一个简单的示例,展示了如何在 C++ 中使用 std::mutex 来同步对共享资源的访问。

实例

#include <iostream>

#include <thread>

#include <mutex>

std::mutex mtx; // 全局互斥锁

int shared_resource = 0;

void increment() {

for (int i = 0; i < 10000; ++i) {

mtx.lock(); // 锁定互斥锁

++shared_resource;

mtx.unlock(); // 解锁互斥锁

}

}

int main() {

std::thread t1(increment);

std::thread t2(increment);

t1.join();

t2.join();

std::cout << "Final value of shared_resource: " << shared_resource << std::endl;

return 0;

}

输出结果:

复制代码
Final value of shared_resource: 20000

2. 使用 std::recursive_mutex

递归互斥锁允许同一个线程多次锁定同一个互斥锁。下面是一个使用 std::recursive_mutex 的示例。

实例

#include <iostream>

#include <thread>

#include <mutex>

std::recursive_mutex rmtx; // 创建一个递归 mutex 对象

int shared_resource = 0; // 共享资源

// 递归函数

void recursive_increment(int count) {

if (count <= 0) return;

std::lock_guard<std::recursive_mutex> lock(rmtx);

++shared_resource;

std::cout << "Incremented shared_resource to " << shared_resource << " (count = " << count << ")" << std::endl;

// 递归调用

recursive_increment(count - 1);

}

int main() {

std::thread t1(recursive_increment, 3); // 线程 t1 执行 recursive_increment(3)

std::thread t2(recursive_increment, 3); // 线程 t2 执行 recursive_increment(3)

t1.join();

t2.join();

std::cout << "Final value of shared_resource: " << shared_resource << std::endl;

return 0;

}

输出结果:

复制代码
Incremented shared_resource to 1 (count = 3)
Incremented shared_resource to 2 (count = 2)
Incremented shared_resource to 3 (count = 1)
Incremented shared_resource to 4 (count = 0)
Incremented shared_resource to 5 (count = 3)
Incremented shared_resource to 6 (count = 2)
Incremented shared_resource to 7 (count = 1)
Incremented shared_resource to 8 (count = 0)
Final value of shared_resource: 8

代码解析:

  1. 创建 std::recursive_mutex 对象std::recursive_mutex rmtx; 是一个递归互斥量,允许同一线程多次获得锁。

  2. 共享资源int shared_resource = 0; 是多个线程共同访问的资源。

  3. 递归函数 recursive_increment

    • 使用 std::lock_guard<std::recursive_mutex>rmtx 上锁。由于使用的是递归互斥量,同一个线程可以多次获得锁。
    • 通过 ++shared_resource 增加共享资源的值。
    • 函数自身递归调用,演示了递归函数在多次锁定的情况下如何安全地工作。
  4. 创建和运行线程

    • std::thread t1(recursive_increment, 3);std::thread t2(recursive_increment, 3); 分别创建两个线程,它们都会执行 recursive_increment(3)
    • t1.join()t2.join() 等待两个线程执行完毕。