单核和双核多线程
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)。有两个以上的可运行任务(检查 top
、htop
、ps
;想象一些 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 上可能不同)、它的缓存、你的编译器和优化标志、生成的机器代码、你的操作系统、其他进程 运行 在您的机器上,中断(例如来自定时器、外部网络数据包、鼠标移动等)等
我正在研究多线程编程
但是,我在阅读计算机系统:程序员的视角时遇到了一个问题,作者是 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)。有两个以上的可运行任务(检查 top
、htop
、ps
;想象一些 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 上可能不同)、它的缓存、你的编译器和优化标志、生成的机器代码、你的操作系统、其他进程 运行 在您的机器上,中断(例如来自定时器、外部网络数据包、鼠标移动等)等