C++并发编程:互斥锁std::mutex和lock_guard的使用

(1)std::mutex 是 C++ 标准库中提供的一种用于多线程同步的互斥锁实现。

mutex 用于控制多个线程访问共享资源,确保在任意时刻只有一个线程可以访问该资源,避免数据竞争。线程在访问共享资源之前首先需要锁住 std::mutex,然后在完成操作后释放锁。这确保了同一时刻只有一个线程可以访问被保护的资源,从而防止多线程并发访问导致的数据不一致性。

(2)std::lock_guard 是 C++ 标准库中提供的一个模板类,用于在其构造时自动获取锁,在析构时自动释放锁。使用 std::lock_guard 的好处是,当 std::lock_guard 对象离开其作用域时,会自动调用析构函数,该析构函数会释放锁。这确保了在任何情况下(包括由于异常等原因导致的提前退出),锁都会被正确释放,从而避免了忘记手动释放锁而导致的死锁问题。

多个线程修改共享数据时,可以这样写:

--------------------------------------------------------

std::mutex myMutex;

共享数据 data;

func(){

   std::lock_guard<std::mutex>lock(myMutex);

  修改共享数据;

}

------------------------------------------

`std::lock_guard<std::mutex> lock(_mutex)` 是 C++11 引入的一种用于管理互斥锁mutex)的机制,它通过RAII(资源获取即初始化)的方式简化了对互斥锁的管理。 以下是对这一语句的解释: 1. **std::lock_guard**: 这是C++标准库中的一个模板类,用于在作用域内自动管理互斥锁。当一个 `std::lock_guard` 对象被创建时,它会尝试获取传入的互斥锁;当该对象被销毁时(例如,离开其作用域),它会自动释放互斥锁。 2. **std::mutex**: 这是C++标准库中用于线程同步的互斥锁类。互斥锁用于保护共享数据,防止多个线程同时访问导致的数据竞争不一致。 3. **_mutex**: 这是一个 `std::mutex` 类型的变量,表示需要被管理的互斥锁。 4. **lock(_mutex)**: 这里创建了一个 `std::lock_guard<std::mutex>` 对象,并将 `_mutex` 传递给它。这意味着 `_mutex` 被锁定,直到 `lock` 对象超出其作用域并被销毁为止。 使用 `std::lock_guard` 的好处在于,它可以确保即使在异常或提前返回的情况下,互斥锁也能被正确释放,从而避免死锁的发生。 示例代码如下: ```cpp #include <iostream> #include <thread> #include <mutex> std::mutex _mutex; void safe_print(const std::string& message) { // 创建一个 std::lock_guard 对象,自动管理互斥锁 std::lock_guard<std::mutex> lock(_mutex); // 此时 _mutex 已被锁定 std::cout << message << std::endl; // 当 lock 对象超出作用域时,_mutex 会被自动解锁 } int main() { std::thread t1(safe_print, "Hello from thread 1"); std::thread t2(safe_print, "Hello from thread 2"); t1.join(); t2.join(); return 0; } ``` 在这个例子中,两个线程会安全地打印消息,而不会因为并发访问而导致数据竞争。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值