当需要同时锁定多个互斥锁时,可以使用 C++11 中的 std::lock() 函数和 std::lock_guard 类。

std::lock() 函数可以同时锁定多个互斥锁,如果其中一个互斥锁无法锁定,则会阻塞当前线程,直到所有互斥锁都被锁定为止。

std::lock_guard 类是一个 RAII(Resource Acquisition Is Initialization)类,用于管理互斥锁的锁定和解锁。当 std::lock_guard 对象被创建时,它会锁定相应的互斥锁;当 std::lock_guard 对象被销毁时,它会自动解锁相应的互斥锁。

以下是一个使用 std::lock()std::lock_guard 的示例:

#include <iostream>
#include <mutex>
#include <thread>

std::mutex mutex1, mutex2;

void thread_func()
{
    std::lock(mutex1, mutex2); // 锁定 mutex1 和 mutex2
    std::lock_guard<std::mutex> lock1(mutex1, std::adopt_lock); // 使用 std::adopt_lock 参数表示已经被锁定
    std::lock_guard<std::mutex> lock2(mutex2, std::adopt_lock); // 使用 std::adopt_lock 参数表示已经被锁定
    // 执行需要同时保护的代码
    std::cout << 'Thread ' << std::this_thread::get_id() << ' is running' << std::endl;
}

int main()
{
    std::thread t1(thread_func);
    std::thread t2(thread_func);
    t1.join();
    t2.join();
    return 0;
}

在上面的示例中,两个线程同时锁定了 mutex1 和 mutex2,并使用 std::lock_guard 类管理锁定和解锁。注意,std::lock_guard 的构造函数需要传入互斥锁对象和一个 std::adopt_lock 参数,表示该互斥锁已经被锁定。

C++ 多线程锁机制:std::lock_guard 多个锁使用指南

原文地址: https://www.cveoy.top/t/topic/kWfu 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录