我从Operating Systems - Internals and Design Principles Eighth Edition提出了一个问题。
我已经尝试了我的答案,但我真的想知道对这个问题的正确答案。
考虑以下C声明和函数定义:
int global_positives = 0; typedef struct list { struct list *next; double val; } *list; void count_positives(list l) { list p; for (p = 1; p; p = p -> next) if (p -> val > 0.0) ++global_positives; }
线程A执行:
count_positives(<list containing only negative numbers>);
和线程B确实:
++global_positives;
a)该功能有什么作用? b)C语言仅解决单线程执行问题。使用两个并行线程会产生任何问题吗?
所以我的答案我想知道是否正确:
a)现在的函数在线程A调用只有负数的函数的情况下什么都不做,因为没有任何东西会大于零以及......
b)在C中并行运行两个线程的问题,因为因为一次只能运行一个,所以global_positives永远不会增加,答案总是为零。
在球场?
答案 0 :(得分:0)
a) 计算正数,不更新全局正数,因此两个线程运行 可以处理不同的全局数据,并且不需要锁定。
b) 在单线程环境中 这是一致的。但是,在多线程环境中,即使列表包含以下内容,它也会分配给全局正计数 只有负面因素。自从更新以来,我们原来的程序现在坏了 由于线程A导致线程B的全局正计数的总和可能丢失 回写更早的全局正计数值。根据Pthread规则, 一个不知道线程的编译器已经将一个完全合法的程序变成了一个 具有未定义的语义。