单核和双核多线程

时间:2018-05-26 05:39:58

标签: c multithreading multicore

我现在正在研究多线程编程

但是,在阅读计算机系统时,我有一个问题:程序员'透视,其作者是布莱恩特

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。

我的问题是

  

在双核中,cnt结果的范围是否可以从10到20不等?

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

由于

1 个答案:

答案 0 :(得分:2)

您有一些race condition,这是undefined behavior。所以任何都可能发生(根据规范),包括整个宇宙的崩溃(或nasal daemons)。是scared

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

实际上,您可能使用某些操作系统,如Linux(或者可能是其他POSIX操作系统,如MacOSX)。有两个以上的可运行任务(查看tophtopps;想象一些thrashing情况),内核调度程序可以为每个核心选择任何一个(在我的Linux桌面上有超过200个进程,其中大多数通常 - 但并不总是空闲)。所以你无法可靠地预测会发生什么。要了解详情,请阅读Operating Systems: Three Easy Pieces

阅读一些pthread tutorial。顺便说一句,请注意Pthread函数名称都以小写中的pthread_开头。

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