21xrx.com
2024-11-05 19:02:15 Tuesday
登录
文章检索 我的文章 写文章
C++ unique lock(互斥锁)
2023-07-03 11:00:35 深夜i     --     --
C++ Unique Lock 互斥锁 多线程 同步控制

在多线程的程序中,为了避免同时对同一个资源进行读写等操作,需要使用互斥锁来控制线程的访问。C++11 加入了 unique_lock,它是一种智能锁,可以更好的控制线程的访问。

unique_lock 会自动处理锁的加锁和解锁,因此程序员不需要再手动的加锁和解锁。同时 unique_lock 还支持多个线程同时访问同一个资源,当某个线程正在访问资源时,其他线程可以阻塞等待,直到当前线程释放锁后,其他线程才能够获得访问资源的机会。

unique_lock 与其他智能指针类似,具有自动释放锁的能力,当 unique_lock 超出函数作用域时,将自动释放锁。

代码示例:


#include <iostream>

#include <vector>

#include <thread>

#include <mutex>

int main() {

  std::vector<int> vec = 3;

  std::mutex mtx;

  std::thread thread1([&]() {

    std::unique_lock<std::mutex> lock(mtx);

    for (auto i = vec.begin(); i != vec.end(); ++i) {

      std::cout << *i << std::endl;

    }

  });

  std::thread thread2([&]() {

    std::unique_lock<std::mutex> lock(mtx);

    for (auto i = vec.begin(); i != vec.end(); ++i) {

      *i += 10;

    }

  });

 

  thread1.join();

  thread2.join();

  for (auto i = vec.begin(); i != vec.end(); ++i) {

    std::cout << *i << std::endl;

  }

  return 0;

}

在上面的代码中,我们创建了两个线程,一个线程用来读取 vector 中的数据,另一个线程用来修改 vector 中的数据。由于共享数据需要加锁,因此我们使用了 unique_lock 来保证线程的安全访问。在线程执行完毕后,unique_lock 会自动释放锁。

总之,unique_lock 为程序员提供了更加灵活和安全的多线程访问方式,帮助我们更好地管理线程资源,提高程序的运行效率和可靠性。

  
  
下一篇: C++反转函数

评论区

{{item['qq_nickname']}}
()
回复
回复