C++学习随笔——lock_guard和mutex的使用方法

std::mutexstd::lock_guard 是 C++ 标准库中用于多线程同步的工具,主要用于防止多个线程同时访问共享资源,导致数据竞争问题。

 

std::mutex 是一个用于互斥锁的类,提供了锁定(lock)和解锁(unlock)的功能。

使用方法:

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

std::mutex mtx;

void printMessage(const std::string& message) {
    mtx.lock();    // 锁定互斥量
    std::cout << message << std::endl;
    mtx.unlock();  // 解锁互斥量
}

int main() {
    std::thread t1(printMessage, "Hello from thread 1");
    std::thread t2(printMessage, "Hello from thread 2");

    t1.join();
    t2.join();
    return 0;
}

解释:

  • mtx.lock():锁定互斥量,使得其他线程在这段代码执行期间无法获得锁。
  • mtx.unlock():解锁互斥量,允许其他线程获取锁。

注意,如果 lock()unlock() 之间的代码抛出了异常,unlock() 可能不会被调用,从而导致死锁。因此,推荐使用 std::lock_guard 进行更安全的锁管理。

===============================================================================================================================

 

std::lock_guard 是一个 RAII(Resource Acquisition Is Initialization)类,自动管理互斥量的锁定和解锁,确保在作用域结束时(无论是正常结束还是异常退出)互斥量被正确解锁

使用方法:

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

std::mutex mtx;

void printMessage(const std::string& message) {
    std::lock_guard<std::mutex> lock(mtx); // 自动锁定
    std::cout << message << std::endl;
    // 作用域结束时,lock_guard 自动解锁互斥量
}

int main() {
    std::thread t1(printMessage, "Hello from thread 1");
    std::thread t2(printMessage, "Hello from thread 2");

    t1.join();
    t2.join();
    return 0;
}

解释:

  • std::lock_guard<std::mutex> lock(mtx);:创建一个 std::lock_guard 对象 lock,并传入互斥量 mtx
  • 在创建 lock 对象时,互斥量 mtx 被锁定,当 lock 对象被销毁时(例如当函数退出或异常抛出时),互斥量自动解锁。

使用 std::lock_guard 的优点:

  • 自动管理锁定和解锁,避免因异常或提前返回导致的死锁。
  • 简洁的语法,更容易编写正确的并发代码。

 

posted @ 2024-08-28 14:46  北宸于烁  阅读(1649)  评论(0)    收藏  举报