C++ std::lock_guard和 std::unique_lock

二者都是 C++ 标准库中用于管理互斥锁(mutex)的 RAII(Resource Acquisition Is Initialization)机制的类。这些类可以确保互斥锁在构造时被获取,在析构时被释放,从而避免死锁和资源泄漏问题。不过,它们在功能和使用方式上有一些重要区别。

std::lock_guard

td::lock_guard 是一个简单的、轻量级的锁管理器,它在构造时获取锁,在析构时释放锁。其主要特点是不能显式地解锁或重新锁定。

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

std::mutex mtx;

void threadFunction(int threadID) {
    try {
        std::lock_guard<std::mutex> lock(mtx);
        // mtx 在此范围内锁定
        std::cout << "Thread " << threadID << " is running..." << std::endl;
        // 模拟一些工作
        std::this_thread::sleep_for(std::chrono::milliseconds(100)); 
        std::cout << "Thread " << threadID << " has finished working." << std::endl;
        // mtx 在此范围末尾解锁
    } catch (const std::exception& e) {
        std::cerr << "Exception caught in thread " << threadID << ": " << e.what() << std::endl;
    }
}

int main() {
    const int numThreads = 5;
    std::vector<std::thread> threads;

    for (int i = 0; i < numThreads; ++i) {
        threads.emplace_back(threadFunction, i);
    }

    for (auto& t : threads) {
        t.join();
    }

    std::cout << "All threads have completed." << std::endl;

    return 0;
}

 

每个线程在输出信息时获取了互斥锁,确保了标准输出的操作是原子的,避免了竞争条件导致的输出混乱。 

std::unique_lock 

std::unique_lock 是一个灵活但稍复杂的锁管理器。它允许更多的锁操作,如延迟锁定、解锁和重新锁定。

// unique_lock example
#include <iostream>       // std::cout
#include <thread>         // std::thread
#include <mutex>          // std::mutex, std::unique_lock

std::mutex mtx;           // mutex for critical section

void print_block (int n, char c) {
  // critical section (exclusive access to std::cout signaled by lifetime of lck):
  std::unique_lock<std::mutex> lck (mtx);
  for (int i=0; i<n; ++i) { std::cout << c; }
  std::cout << '\n';
}

int main ()
{
  std::thread th1 (print_block,50,'*');
  std::thread th2 (print_block,50,'$');

  th1.join();
  th2.join();

  return 0;
}

order of lines may vary, but characters are never mixed. 

void threadFunction() {
    std::unique_lock<std::mutex> lock(mtx);
    // 可以显式解锁
    std::this_thread::sleep_for(std::chrono::seconds(1)); // 模拟工作
    std::cout << "Thread is running..." << std::endl;
    lock.unlock();

    // 可以重新加锁
    lock.lock();
    std::cout << "Thread is finishing..." << std::endl;
}

int main() {
    std::thread t1(threadFunction);
    std::thread t2(threadFunction);

    t1.join();
    t2.join();

    return 0;
}

 

std::unique_lockstd::lock_guard都是C++标准库提供的互斥锁RAII封装工具,用于实现互斥访问,但它们在使用方法和功能上有一些不同之处。\[1\] std::lock_guard是基于互斥锁std::mutex实现的,而std::unique_lock是基于通用锁std::unique_lock实现的。std::lock_guard是不可移动的,只能通过构造函数初始化和析构函数销毁,而std::unique_lock是可移动的,可以拷贝、赋值、移动。\[1\] std::unique_lock提供了更多的控制锁的行为,比如锁超时、不锁定、条件变量等。因此,如果只需要简单的互斥保护,使用std::lock_guard更好。而如果需要更灵活的锁操作,可以选择使用std::unique_lock。\[1\] 下面是std::lock_guardstd::unique_lock的简单使用示例,可以看出二者在使用方法上的区别:\[2\] 示例:用std::lock_guard加互斥锁 { std::lock_guard<std::mutex> lock(mutex); // 互斥操作 } 示例:用std::unique_lock加互斥锁并手动释放锁 { std::unique_lock<std::mutex> lock(mutex); // 互斥操作 lock.unlock(); // 手动释放锁 // 非互斥操作 lock.lock(); // 再次加锁 // 互斥操作 } 总结来说,std::lock_guard适用于简单的互斥保护,而std::unique_lock提供了更多的灵活性和控制锁的行为的功能。根据具体的需求选择使用哪种锁封装工具。\[1\] #### 引用[.reference_title] - *1* *2* [std::lock_guard(轻锁)std::unique_lock(重锁)区别](https://blog.csdn.net/nihao_2014/article/details/131208348)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [C++lock_guardunique_lock 的使用](https://blog.csdn.net/sinat_31608641/article/details/107734045)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

**K

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值