数据竞争与不可重入函数检测:多线程程序优化
需积分: 0 166 浏览量
更新于2024-08-05
收藏 840KB PDF 举报
在谷正阳的并行与分布式计算作业3中,他主要探讨了数据竞争和不可重入函数两个关键主题。作业涉及到使用LLVM和Soot工具来检测多线程程序中的并发问题。以下是详细的知识点:
1. **数据竞争检测**:
- 学习了如何利用ThreadSanitizer工具来检测多线程程序中的数据竞争。谷正阳首先回顾了实验一中的两个程序:列向量内元素求和和列向量求和。通过分析,他确认这两个程序不存在数据竞争。然而,实验二中的分治算法求矩阵乘积在改为多线程后出现了数据竞争,初始的矩阵乘积规模过大导致报错信息过长,因此他缩小规模到2*2矩阵乘法,发现是由于多个线程同时使用同一块堆内存导致的冲突。
2. **自旋锁与资源管理**:
- 学习了内核中的两种锁机制:自旋锁和挂起进程。自旋锁,如Spinlock,是一种原地等待的策略,适用于资源冲突短暂的情况。但它的缺点是不适合长时间持有,因为会消耗大量CPU资源。谷正阳在使用ThreadSanitizer分析后,发现没有错误,然后使用perf工具分析运行效率,发现带有锁的多线程程序效率远低于单线程,因为数据竞争并未对结果产生负面影响。
3. **不可重入函数识别**:
- 在解决不可重入函数的问题上,谷正阳编写了一个简单的程序tiny_race.c,包含几种不同类型的不可重入函数,如全局变量访问、标准IO操作(getchar)和动态内存分配(malloc)。这些函数可能在多线程环境下引发问题,需要确保它们的调用不会违反互斥规则。
4. **实验结论**:
- 实验结果显示,对于较小的数据规模,数据竞争的影响可能并不显著,且在特定情况下(如读写分离且数据唯一),即使存在竞争也不会改变结果。另一方面,不可重入函数的识别和处理是确保多线程程序正确性的重要步骤。
谷正阳通过这个作业深化了对并行编程中并发控制的理解,尤其是在数据竞争和线程安全性方面,同时学习了如何使用工具来检测和优化这些问题。
2022-08-03 上传
2022-08-03 上传
2022-08-03 上传
2023-07-10 上传
2023-09-27 上传
2023-10-20 上传
2023-07-11 上传
2023-06-24 上传
2024-12-11 上传
首席程序IT
- 粉丝: 40
- 资源: 305
最新资源
- hibernate2安装手记.pdf
- 开源技术选型手册推荐
- 电脑超级技巧 很多的电脑问题迎刃而解
- C#完全手册 经典 权威
- Beginning Python 2ndEdition
- ISD2560中文芯片资料
- 操作数据库的通用类包含各种方法
- delphi函数参考手册
- Oracle语句优化53个规则详解(1)
- aaaaaaaaaaaaaaaaa
- Rapid GUI programming With Python And Qt
- ubuntu linux命令行简明教程
- c++ 标准库讲解,带给你一个全新的境界
- WebLogic 集群中SSL 配置说明
- OraclePL-SQL语言初级教程
- 将GridView列表当中的数据导成Excel