首页 > 解决方案 > 单核和双核多线程

问题描述

我现在正在学习多线程编程

但是,我在阅读 Computer Systems: Programmers' Perspective 时有一个问题,作者是 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。

我的问题是

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

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

谢谢

标签: cmultithreadingmulticore

解决方案


您有一些竞争条件,这是一种未定义的行为。所以任何事情都可能发生(根据规范),包括整个宇宙的崩溃(或鼻守护进程)。害怕。_

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

在实践中,您可能使用一些操作系统,如 Linux(或者可能是另一个 POSIX 操作系统,如 MacOSX)。有两个以上的可运行任务(用top, htop,进行检查ps;想象一些颠簸的情况),内核调度程序可以为每个内核选择其中的任何一个(在我的 Linux 桌面上,有 200 多个进程,其中大多数通常是 - 但不是总是空闲)。因此,您无法可靠地预测会发生什么。要了解更多信息,请阅读操作系统:三个简单的部分

阅读一些pthread 教程。顺便说一句,请注意 Pthread 函数名称都以pthread_小写字母开头。

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


推荐阅读