c - 线程为 "slow"作为非线程

标签 c multithreading algorithm pthreads theory

今天我在用 python 中的线程计算质数时遇到了问题。它几乎和没有线程一样慢(参见 Question )。

现在我创建了相同的代码,认为使用 pthread 在 C 中不存在 python 问题。

#include <stdio.h>
#include <time.h>
#include <pthread.h>

int isPrime(int number) {
    int i;
    for (i=2; i<number; i++) {
        if (number % i == 0 && i != number) return 0;
    }
    return 1;
}

void calcPrimeNumbersFromNtoM(int n, int m){
    for (int i = n; i <= m; i++) {
        if (isPrime(i)) {
            //printf("%i\n",i);
        }
    }

}

void *calcFirstHalf(){
    calcPrimeNumbersFromNtoM(1,5000);
    return NULL;
}

void *calcSecondHalf(){
    calcPrimeNumbersFromNtoM(5001,10000);
    return NULL;
}

void calcThreadedPrimenumbers(){
    pthread_t t1, t2;
    pthread_create(&t1, NULL, calcFirstHalf, NULL);
    pthread_create(&t2, NULL, calcSecondHalf, NULL);

    //wait for the threads to finish
    pthread_join(t1, NULL);
    pthread_join(t2, NULL);
}

int main(int argc, const char * argv[])
{

    clock_t startNT, endNT,startT, endT;
    double cpu_time_usedNT,cpu_time_usedT;
    startNT = clock();
    calcPrimeNumbersFromNtoM(1, 10000);
    endNT = clock();
    cpu_time_usedNT = ((double) (endNT - startNT)) / CLOCKS_PER_SEC;

    startT = clock();
    calcThreadedPrimenumbers();
    endT = clock();
    cpu_time_usedT = ((double) (endT - startT)) / CLOCKS_PER_SEC;


    printf("--------Results-----------\n");
    printf("Non threaded took: %f secs\n",cpu_time_usedNT);
    printf("Threaded took: %f secs\n",cpu_time_usedT);


    return 0;
}

结果是线程再次和非线程一样慢:

--------Results-----------
Non threaded took: 0.020624 secs
Threaded took: 0.027257 secs

这让我很困惑。我的代码有问题吗?线程真的不需要比不使用线程更快吗?如果是,对此的解释是什么?

这是因为操作系统需要调度同一个任务,只分成两部分,导致相同的时间量吗?

也许这很重要:我使用 2.6Ghz Core i5 MacBook 和 OSX 10.9

最佳答案

您的素数计算器是 O(n^2)。请注意,5000^2 = 25000000,而 (10,000^2)/2 = 50000000

这使得第二个线程成为算法的瓶颈,并且为第一个线程等待了大量时间。
换句话说,与第二个线程相比,第一个线程做的工作很少,因此第一个线程空闲了大部分工作。

关于c - 线程为 "slow"作为非线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23352047/

相关文章:

c - pthreads/等待(&状态)

支持二进制数据的javascript压缩算法?

算法题 最大化函数的平均数

java - 求 A[J] +- A[I] 的最大值

c - 使用 Eclipse 开发 C 应用程序时的内存映射

c - 空终止符是否适合解析二进制文件

我可以使用指针打印出 int 数组的数组,就像字符串数组一样吗?

c - 嵌入式linux中telnet的登录与管理

python - 在 Python 中实现类似缓冲区的结构

c# - 线程返回值问题