为什么我的应用程序没有在Mac OS X上使用所有内核?

时间:2014-09-10 18:05:52

标签: multithreading macos pthreads

我有一个简单的pthread程序(应该)产生很多线程,只是旋转和消耗CPU。但是,我从来没有看到过这个程序在我的Mac OS X Mavericks笔记本上占用了4个核心中的1个以上。

关于为什么会发生这种情况的理论:

  • 操作系统是否阻止一个进程接管机器?
  • OS X调度程序关于亲和力是否非常紧张?
  • 这是一个内核设置我可以调整一些吗?
  • OS X上的pthread实现是否以某种方式出现了障碍?

我不知道。

我问,因为我也有一个严肃的应用程序(用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;
}

1 个答案:

答案 0 :(得分:1)

从waste_time()循环中取出printf()调用 - 它被称为10000000次!在返回之前完全摆脱它或将它放在循环之外。

waste_time()的操作目前由C lib控制,并且在OS I / O下面调用,为了防止对stdout的灾难性多线程访问,它具有内部锁定。锁几乎完成了整个流程的运行,因此操作系统可以(主要)在一个核上运行它。