当前位置: 首页 > news >正文

【C++多线程编程】(二)之详解锁(lock)和解锁(unlock)

在C++多线程编程中,锁(lock)和解锁(unlock)通常用于管理共享资源的访问,以防止多个线程同时对资源进行修改,从而避免竞态条件(Race Condition)和数据不一致性问题。C++标准库提供了一些工具来实现锁,其中最常用的是互斥锁(std::mutex)和锁卫士(std::lock_guard)。

以下是一个简单的示例,演示了如何在C++中使用互斥锁和锁卫士:

#include <iostream>
#include <thread>
#include <mutex>std::mutex myMutex;  // 定义一个互斥锁void sharedResourceFunction(int id) {// 在代码块中使用锁卫士,lock_guard 在构造时锁住互斥锁,在析构时释放锁std::lock_guard<std::mutex> lock(myMutex);// 在这个代码块中,对共享资源进行读写操作是安全的std::cout << "Thread " << id << " is accessing the shared resource." << std::endl;// 在这个代码块结束后,锁会自动释放,即使发生了异常
}int main() {const int numThreads = 3;std::thread threads[numThreads];for (int i = 0; i < numThreads; ++i) {threads[i] = std::thread(sharedResourceFunction, i + 1);}for (int i = 0; i < numThreads; ++i) {threads[i].join();}return 0;
}

1、std::mutex myMutex;:这一行定义了一个互斥锁对象 myMutex。互斥锁用于保护共享资源,确保在任何时候只有一个线程可以访问它。

2、std::lock_guardstd::mutex lock(myMutex);:这一行创建了一个 std::lock_guard 对象,它在构造时锁住 myMutex,在析构时释放锁。这确保了在进入 sharedResourceFunction 函数时锁被锁住,在函数结束时锁被自动释放。这种自动释放锁的方式避免了忘记手动释放锁的问题。

3、std::cout << “Thread " << id << " is accessing the shared resource.” << std::endl;:在锁保护的代码块中对共享资源进行操作。在这个例子中,只是简单地打印一条信息。

4、std::thread threads[numThreads];:创建了一个包含 numThreads 个线程的数组。

5、threads[i] = std::thread(sharedResourceFunction, i + 1);:创建了多个线程,每个线程都调用 sharedResourceFunction 函数,并传递不同的线程ID(1、2、3)。

6、threads[i].join();:等待所有线程执行完毕。调用 join 保证主线程等待所有子线程执行完毕后再继续执行,防止主线程提前退出导致子线程被强制终止。

总体而言,这个例子演示了如何使用互斥锁和锁卫士确保多个线程对共享资源的安全访问。在实际应用中,需要根据具体情况选择适当的同步机制和锁类型。

http://www.lryc.cn/news/261678.html

相关文章:

  • 【Mypy】超级实用的python高级库!
  • 【Python基础】循环语句
  • 【面试】广告优化
  • RabbitMQ插件详解:rabbitmq_message_timestamp【Rabbitmq 五】
  • AD9361 Evaluation Software配置脚本转换工具
  • Centos7 配置Git
  • python工具方法 44 数据仿真生成(粘贴目标切片到背景图像上,数据标签校验)
  • Llama 架构分析
  • vue3前端 md5工具类
  • Unity触摸 射线穿透UI解决
  • 基于QTreeWidget实现带Checkbox的多级组织结构选择树
  • 探索 Vim:一个强大的文本编辑器
  • K8S(十)—容器探针
  • [C错题本]
  • tomcat启动异常:子容器启动失败(a child container failed during start)
  • JAVA序列化(创建可复用的 Java 对象)
  • 如何使用自动化工具编写测试用例?
  • redis底层数据结构之skiplist实现
  • mjpg-streamer配置其它端口访问视频
  • C++相关闲碎记录(15)
  • 汽车IVI中控开发入门及进阶(十一):ALSA音频
  • Gradle 之初体验
  • 【Spark精讲】Spark内存管理
  • C语言实现Hoare版快速排序(递归版)
  • git 避免输入用户名 密码 二进制/文本 文件冲突解决
  • [OpenWrt]RAX3000一根线实现上网和看IPTV
  • 最新50万字312道Java经典面试题52道场景题总结(附答案PDF)
  • ​html.parser --- 简单的 HTML 和 XHTML 解析器​
  • 赵传和源代码就是设计-UMLChina建模知识竞赛第4赛季第23轮
  • Leaflet.Graticule源码分析以及经纬度汉化展示