数据竞争与不可重入函数检测:多线程程序优化

需积分: 0 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. **实验结论**: - 实验结果显示,对于较小的数据规模,数据竞争的影响可能并不显著,且在特定情况下(如读写分离且数据唯一),即使存在竞争也不会改变结果。另一方面,不可重入函数的识别和处理是确保多线程程序正确性的重要步骤。 谷正阳通过这个作业深化了对并行编程中并发控制的理解,尤其是在数据竞争和线程安全性方面,同时学习了如何使用工具来检测和优化这些问题。