"习题课11主要探讨了多线程编程中的一些问题,涉及到C++语言在处理并发执行时的局限性以及临界资源的管理。具体问题围绕着一个链表正数计数函数count_positives()和使用exchange指令实现相同效果的讨论。"
在多线程编程中,语言规范的适用性至关重要。C++和C等一些语言的原始规格可能不充分支持多线程程序,这可能导致编译器问题以及代码的正确性受到影响。题目的第一部分展示了一个例子:
1. 定义了一个全局变量`global_positives`用于存储正数的计数,以及一个链表结构`list`,链表节点包含一个指向下一个节点的指针`next`和一个双精度浮点值`val`。
2. `count_positives(list l)`函数遍历链表`l`,统计其中大于0的`val`的个数,增加`global_positives`的值。若链表中所有值都是负数,线程A执行该函数时不会修改`global_positives`,而线程B可以安全地独立递增`global_positives`。
然而,这个例子仅考虑了特定情况。在更一般的情况下,如果多个线程同时调用`count_positives()`,它们都可能会访问并修改`global_positives`,导致数据竞争。因此,`global_positives`是一个临界资源,需要通过锁或其他同步机制来确保互斥访问,以避免并发问题。
第二部分问题来源于书上的另一个实例,可能涉及原子操作或内存模型。题目提到使用exchange指令实现与图5.2b中第一次赋值`bolt=0`相同的效果。exchange指令通常用于原子地设置一个变量的值,并返回旧值,常用于实现线程间的同步。但是,具体的实现细节(如如何使用exchange指令,以及它如何影响结果)没有在摘要中给出。
总结,习题课11强调了在多线程环境中正确管理共享资源的重要性,特别是当涉及到并发修改全局变量时。C++标准库提供了一些工具,如`std::mutex`和原子类型(`std::atomic`),用于解决这类问题,确保并发代码的正确性和一致性。程序员应理解这些概念,并在编写多线程代码时采取适当的同步措施。