C语言中的线程回答有关多线程的问题

时间:2015-02-27 00:16:50

标签: c multithreading thread-safety

我从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永远不会增加,答案总是为零。

在球场?

1 个答案:

答案 0 :(得分:0)

a) 计算正数,不更新全局正数,因此两个线程运行 可以处理不同的全局数据,并且不需要锁定。

b) 在单线程环境中 这是一致的。但是,在多线程环境中,即使列表包含以下内容,它也会分配给全局正计数 只有负面因素。自从更新以来,我们原来的程序现在坏了 由于线程A导致线程B的全局正计数的总和可能丢失 回写更早的全局正计数值。根据Pthread规则, 一个不知道线程的编译器已经将一个完全合法的程序变成了一个 具有未定义的语义。