我现在正在研究多线程编程
但是,在阅读计算机系统时,我有一个问题:程序员'透视,其作者是布莱恩特
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不等?
简单的想法,我不这么认为,但我想听听很多人的意见。
由于
答案 0 :(得分:2)
您有一些race condition,这是undefined behavior。所以任何都可能发生(根据规范),包括整个宇宙的崩溃(或nasal daemons)。是scared。
您需要深入了解实施细节,以了解实际发生的事情,并且您不想......(而且您可能无法掌握所有细节)。
实际上,您可能使用某些操作系统,如Linux(或者可能是其他POSIX操作系统,如MacOSX)。有两个以上的可运行任务(查看top
,htop
,ps
;想象一些thrashing情况),内核调度程序可以为每个核心选择任何一个(在我的Linux桌面上有超过200个进程,其中大多数通常 - 但并不总是空闲)。所以你无法可靠地预测会发生什么。要了解详情,请阅读Operating Systems: Three Easy Pieces。
阅读一些pthread tutorial。顺便说一句,请注意Pthread函数名称都以小写中的pthread_
开头。
具体而言,你的直觉(10到20之间的cnt
)可能是好的。但你无法保证。细节取决于太多的东西:你的处理器指令集架构和模型(在AMD和英特尔上可能有所不同),它的缓存,你的编译器和优化标志,生成的机器代码,你的操作系统,你运行的其他进程机器,中断(例如来自定时器,外部网络数据包,鼠标移动......)等。