中山大学黄玟瑜:用semaphore优化π计算的多线程并发问题

需积分: 0 0 下载量 134 浏览量 更新于2024-08-05 收藏 553KB PDF 举报
本篇实验报告是关于中山大学2019级计算机科学与技术(超算)专业的学生黄玟瑜在2021年4月11日至11日之间完成的项目。实验主题是使用pthread库中的信号量(Semaphore)来优化计算圆周率(π)的算法。原计划是通过并行化一个串行计算π的算法,利用多线程将for循环分解成多个子任务,每个线程负责一部分范围内的计算,然后将结果累加到全局变量sum中。 原始的串行代码中,计算π的公式涉及一个for循环,每个迭代计算因子(factor)乘以(2i+1)^(-1),并将结果累加到sum中。当n值增大时,单线程计算可能效率较低,而多线程版本可能会因并发访问共享变量sum导致结果不一致,这就是所谓的“竞态条件”或“数据竞争”。 在并行实现中,关键的瓶颈在于如何确保线程安全地更新sum。由于计算机内部的内存管理机制,数据不能直接在主存和CPU寄存器之间进行加法运算,因此在sum+=my_sum;这一操作中,需要同步机制来保护。信号量被引入作为解决这个问题的工具,它是一种锁机制,可以控制对共享资源的访问。sem_init函数用于创建信号量,指定初始值,如0表示没有线程可以访问,而sem_wait函数用于线程请求信号量,直到获取到信号量后才能执行临界区(sum+=my_sum;这部分代码)。sem_post函数则用于释放信号量,允许其他等待的线程继续执行。 在并行计算π的程序中,信号量的作用至关重要,它确保了在任一时刻只有一个线程能够执行临界区的操作,从而避免了数据冲突。整个过程中,学生运用了操作系统提供的线程管理和同步机制,将单个计算任务分解,提高了程序的执行效率,同时也展示了在多线程环境下正确处理并发问题的重要性。 总结来说,这篇实验报告探讨了在计算机科学与技术领域,特别是在并行计算中,如何利用信号量这一并发控制机制来解决多线程编程中的数据一致性问题,从而提高程序的正确性和性能。通过这个实例,学生深化了对线程同步、临界区和并发编程的理解。