c - 单核和双核多线程
问题描述
我现在正在学习多线程编程
但是,我在阅读 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 不同?
简单来说,我不这么认为,但我想听听很多人的意见。
谢谢
解决方案
您有一些竞争条件,这是一种未定义的行为。所以任何事情都可能发生(根据规范),包括整个宇宙的崩溃(或鼻守护进程)。害怕。_
您需要深入了解实现细节以了解实际发生的情况,并且您不想......(并且您可能无法掌握所有细节)。
在实践中,您可能使用一些操作系统,如 Linux(或者可能是另一个 POSIX 操作系统,如 MacOSX)。有两个以上的可运行任务(用top
, htop
,进行检查ps
;想象一些颠簸的情况),内核调度程序可以为每个内核选择其中的任何一个(在我的 Linux 桌面上,有 200 多个进程,其中大多数通常是 - 但不是总是空闲)。因此,您无法可靠地预测会发生什么。要了解更多信息,请阅读操作系统:三个简单的部分。
阅读一些pthread 教程。顺便说一句,请注意 Pthread 函数名称都以pthread_
小写字母开头。
具体来说,你的直觉(cnt
在 10 到 20 之间)可能很好。但你无法保证。细节取决于太多的东西:你的处理器指令集架构和模型(在 AMD 和 Intel 上可能不同)、它的缓存、你的编译器和优化标志、生成的机器代码、你的操作系统、在你的操作系统上运行的其他进程机器、中断(例如来自定时器、外部网络数据包、鼠标移动……)等。
推荐阅读
- javascript - 如何通过单击一个按钮使用本地存储删除我的待办事项列表中的项目
- reactjs - 如何使用 ReactJs 功能组件单击鼠标单击选择所有 Div 文本?
- python - 比较两个复杂单词列表中的相似性
- python - 哪个公式用于使用metpy从露点计算相对湿度?
- postgresql - Postgres TDE 功能仅适用于特定模式
- parsing - 从字符串解析浮点数(v-lang)
- objective-c - NSLayoutManager 字形生成和插入符号位置
- node.js - 节点测试模块返回测试错误
- python - 有限制的排列
- html - 我可以为同一个 url .htaccess 使用多个 RewriteRules