我有一个简单的pthread程序(应该)产生很多线程,只是旋转和消耗CPU。但是,我从来没有看到过这个程序在我的Mac OS X Mavericks笔记本上占用了4个核心中的1个以上。
关于为什么会发生这种情况的理论:
我不知道。
我问,因为我也有一个严肃的应用程序(用D编写),我想使用所有CPU进行一些并行工作,但即使是最简单的pthread程序也不会过去1核心。
#include <pthread.h>
#include <stdio.h>
void *waste_time(void* a) {
for (int i = 0; i < 10000000; i++) {
printf("%d\n", i);
}
return NULL;
}
int main(void) {
const int threads = 100;
pthread_t thread[threads];
for (int i = 0; i < threads; i++) {
pthread_create(&thread[i], NULL, waste_time, NULL);
}
for (int i = 0; i < threads; i++) {
pthread_join(thread[i], NULL);
}
return 0;
}
答案 0 :(得分:1)
从waste_time()循环中取出printf()调用 - 它被称为10000000次!在返回之前完全摆脱它或将它放在循环之外。
waste_time()的操作目前由C lib控制,并且在OS I / O下面调用,为了防止对stdout的灾难性多线程访问,它具有内部锁定。锁几乎完成了整个流程的运行,因此操作系统可以(主要)在一个核上运行它。