21xrx.com
2025-07-12 19:49:15 Saturday
登录
文章检索 我的文章 写文章
C++ 多线程锁:保障线程安全的关键技术
2023-07-07 03:16:07 深夜i     29     0
C++ 多线程 线程安全 关键技术

在C++语言中,多线程编程已经成为必须要掌握的一项关键技术。在多线程编程中,最重要的就是保障线程安全。因此,多线程锁成为了保障线程安全的关键技术。

多线程锁是一种同步机制,它可以确保多个线程对共享资源的访问不会发生冲突,从而避免了竞态条件。在C++中,我们常用的多线程锁有互斥锁(mutex)和读写锁(read-write lock)。

互斥锁是一种最常用的多线程锁,它可以确保同一时间只有一个线程可以访问共享资源。当一个线程试图获取互斥锁时,如果该锁已经被其它线程占用,则该线程会被阻塞,直到获取锁为止。互斥锁可以通过C++标准库中的std::mutex类进行实现。

例如,下面的代码演示了如何使用互斥锁:

#include <iostream>
#include <thread>
#include <mutex>
std::mutex mtx; // 互斥锁
void print(int num)
{
  mtx.lock(); // 获取锁
  std::cout << "ThreadId: " << std::this_thread::get_id() << ", num: " << num << std::endl;
  mtx.unlock(); // 释放锁
}
int main()
{
  std::thread t1(print, 1);
  std::thread t2(print, 2);
  std::thread t3(print, 3);
  t1.join();
  t2.join();
  t3.join();
  return 0;
}

运行结果如下:

ThreadId: 139934610497024, num: 1
ThreadId: 139934627282432, num: 2
ThreadId: 139934635675136, num: 3

可以看到,三个线程分别输出了它们的线程ID和对应的数字,输出结果是按照顺序输出的。

读写锁是一种更高级别的多线程锁。它可以提高多个线程对共享资源的访问效率,适用于读操作频繁、写操作相对较少的场景。读写锁允许多个线程同时读取共享资源,但是只允许一个线程进行写操作,当有线程正在进行写操作时,其它线程无法读取共享资源和进行写操作。读写锁可以通过C++标准库中的std::shared_mutex和std::unique_lock类进行实现。

例如,下面的代码演示了如何使用读写锁:

#include <iostream>
#include <thread>
#include <shared_mutex>
std::shared_mutex rw_mtx; // 读写锁
void read(int num)
{
  std::shared_lock<std::shared_mutex> lock(rw_mtx); // 获取共享锁
  std::cout << "ThreadId: " << std::this_thread::get_id() << ", read num: " << num << std::endl;
}
void write(int num)
{
  std::unique_lock<std::shared_mutex> lock(rw_mtx); // 获取独占锁
  std::cout << "ThreadId: " << std::this_thread::get_id() << ", write num: " << num << std::endl;
}
int main()
{
  std::thread t1(read, 1);
  std::thread t2(read, 2);
  std::thread t3(write, 3);
  std::thread t4(read, 4);
  t1.join();
  t2.join();
  t3.join();
  t4.join();
  return 0;
}

运行结果如下:

ThreadId: 140343672969984, read num: 1
ThreadId: 140343664577280, read num: 2
ThreadId: 140343680762688, write num: 3
ThreadId: 140343656184576, read num: 4

可以看到,t1和t2线程同时读取了共享资源,t3线程进行了写操作,t4线程在t3写操作完成后才进行了读操作。

综上所述,C++中的多线程锁是保障线程安全的关键技术之一,互斥锁和读写锁是最常用的多线程锁。在实际开发中,我们需要根据场景选择合适的多线程锁,以保障程序的正确性和性能。

  
  

评论区