单核和双核多线程

multi thread in single core and dual core

我正在研究多线程编程

但是,我在阅读计算机系统:程序员的视角时遇到了一个问题,作者是 Bryant

badcnt.c写成

#include "csapp.h"

void *thread(void *vargp);
volatile long cnt = 0;
int main(int argc, char **argv){
  long niters;
  pthread_t tid1, tid2;

  niters = atoi(argv[1]);
  Pthread_create(&tid1, NULL, thread, &niters);
  Pthread_create(&tid2, NULL, thread, &niters);
  Pthread_join(tid1, NULL);
  Pthread_join(tid2, NULL);

  printf("cnt = %ld\n", cnt);
}

void *thread(void *vargp){
  long i;
  long niters = *((long *) vargp);
  for(i = 0; i < niters; i++) cnt++;

  return NULL;
}

我知道在单处理器中,机器指令是按照某种顺序一条接一条完成的,所以cnt结果可以从10到20。

我的问题是

Does cnt result's range can be different from 10 to 20 in dual-core?

简单的想,我不这么认为,但是我想听听很多人的意见。

谢谢

你有一些 race condition which is an undefined behavior. So anything could happen (according to the specs), including the collapse of the entire universe (or nasal daemons). Be .

您需要深入实施细节以了解真正发生的事情,而您不想...(并且您可能无法掌握所有细节)。

实际上,您可能使用某些操作系统,例如 Linux(或者可能是另一个 POSIX 操作系统,例如 MacOSX)。有两个以上的可运行任务(检查 tophtopps;想象一些 thrashing situation), and the kernel scheduler can choose any of them for each core (on my Linux desktop there is more than 200 processes, most of them usually -but not always- idle). So you cannot predict reliably what happens. To learn more, read Operating Systems: Three Easy Pieces

阅读一些 pthread tutorial。顺便说一句,请注意 Pthread 函数名称均以 小写 .

中的 pthread_ 开头

具体来说,您的直觉(cnt 介于 10 和 20 之间)可能不错。但你不能保证。细节取决于太多东西:你的处理器指令集架构和模型(因此在 AMD 和 Intel 上可能不同)、它的缓存、你的编译器和优化标志、生成的机器代码、你的操作系统、其他进程 运行 在您的机器上,中断(例如来自定时器、外部网络数据包、鼠标移动等)等