holyya.com
2025-09-04 08:13:35 Thursday
登录
文章检索 我的文章 写文章
C++ 多线程锁:保障线程安全的关键技术
2023-07-07 03:16:07 深夜i     --     --
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++中的多线程锁是保障线程安全的关键技术之一,互斥锁和读写锁是最常用的多线程锁。在实际开发中,我们需要根据场景选择合适的多线程锁,以保障程序的正确性和性能。

  
  

评论区

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