C++ 11 互斥体在函数体内的lock和unlock

本文介绍了一个简单的LockGuard模板类实现,该类利用局部变量的作用域特性,在构造时锁定互斥锁并在析构时自动解锁,确保了资源使用的安全性。

话不多少,先上代码:

template<class _Mutex>
class LockGuard {
public:
    explicit LockGuard(_Mutex& _Mtx)
        : _MyMutex(_Mtx) {
        // construct and lock
        _MyMutex.lock();
    }

    ~LockGuard() {
        // unlock
        _MyMutex.unlock();
    }

private:
    _Mutex& _MyMutex;

    LockGuard(const LockGuard&);
    LockGuard& operator=(const LockGuard&) ;
};

其实原理很简单,就是利用的局部变量在函数体中执行完后自动释放的特性。作用域范围:在函数体中定义的位置~函数体结束

C++中,`lock.lock()` `lock.unlock()` 通常用于管理共享资源的访问,以防止多个线程同时对资源进行修改,从而避免竞态条件数据不一致性问题。C++标准库提供了一些工具来实现锁,其中最常用的是互斥锁(`std::mutex`)锁卫士(`std::lock_guard`) [^3]。 以下是使用 `std::mutex` 的 `lock()` `unlock()` 方法的示例: ```cpp #include <iostream> #include <thread> #include <mutex> #include <deque> class lock_unlock { public: lock_unlock() {} void WriteOperate() { for (int i = 0; i < 1000; i++) { nums_mutex.lock(); std::cout << "写入一个元素" << std::endl; nums_deque.push_back(i); nums_mutex.unlock(); } } void ReadOperate() { for (int i = 0; i < 1000; i++) { nums_mutex.lock(); if (!nums_deque.empty()) { std::cout << "读出第一个元素" << nums_deque.front() << std::endl; nums_deque.pop_front(); } nums_mutex.unlock(); } } private: std::deque<int> nums_deque; std::mutex nums_mutex; }; int main(int argc, char* argv[]) { lock_unlock lock; std::thread nums_thread1(&lock_unlock::WriteOperate, std::ref(lock)); std::thread nums_thread2(&lock_unlock::ReadOperate, std::ref(lock)); // 线程阻塞 nums_thread1.join(); nums_thread2.join(); std::cout << "执行完毕!" << std::endl; return 0; } ``` 在上述示例中,`WriteOperate` `ReadOperate` 方法都使用了 `nums_mutex.lock()` 来获取锁,确保在操作共享资源 `nums_deque` 时线程安全。为了确保锁最终会被释放,在操作完成后调用了 `nums_mutex.unlock()` [^2]。 另外,在需要灵活控制锁的场景下,还可以使用 `std::unique_lock` 来手动控制锁的加锁解锁: ```cpp #include <condition_variable> #include <mutex> std::condition_variable cv; bool data_ready = false; std::mutex mtx; // 生产者 void producer() { std::unique_lock<std::mutex> lock(mtx, std::defer_lock); // 延迟加锁 // ... 准备数据(非临界区)... lock.lock(); // 手动加锁 data_ready = true; lock.unlock(); // 手动提前解锁 cv.notify_one(); // 通知消费者 } // 消费者 void consumer() { std::unique_lock<std::mutex> lock(mtx); cv.wait(lock, []{ return data_ready; }); // 条件变量等待 // ... 处理数据 ... } ``` 在这个示例中,`producer` 函数使用 `std::unique_lock` 手动控制锁的加锁解锁,在准备数据的非临界区不持有锁,提高了程序的并发性能 [^5]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值