c - C 中的单线程与 pthread 的多线程

标签 c multithreading performance pthreads

我在这里想做的是通过做一个简单且重复的操作来比较单线程和多线程的性能。因此,我有两个线程将此随机数 0xde 分配给该数组,每个线程获取数组的前半部分和后半部分,而单线程本身从索引 0 到末尾执行相同的工作。

我不明白的是,尽管这些子线程完成了单线程(即主线程)一半的工作,但它们却花费了更多的时间来完成任务!我不希望它花费单线程一半的时间,但我无法想象为什么它会比单线程花费更长的时间。

更令人惊讶的是,如果我先切换顺序以进行单线程,那么我就会得到我想要的结果。我真的需要一些帮助,因为这在我的脑子里都是一团糟。提前致谢!

ps。我正在使用 Raspberry Pi 3,它有 4 个 ARM 处理器(如果有帮助的话)。 这是我得到的结果。 多线程1:46毫秒
多线程2:50毫秒
单线程:34 毫秒

#include <pthread.h>
#include <stdio.h>
#include <time.h>
#define SIZE 1000000

clock_t difference = 0;
clock_t difference1 = 0;
clock_t difference2 = 0;

void *substitute1(void *operand)
{
    int *arr = (int *)operand;
    int i=0;
    clock_t before1 = clock();

    for(i=0;i<(SIZE/2);i++)
    {
        arr[i] = 0x00de;
    }
    difference1 = clock() - before1;
    return NULL;
}


void *substitute2(void *operand)
{
    int *arr = (int *)operand;
    int i=0;
    clock_t before2 = clock();

    for(i=(SIZE/2);i<SIZE;i++)
    {
        arr[i] = 0x00de;
    }
    difference2 = clock() - before2;
    return NULL;
}

void single_thread(int *arr);

int main(void)
{
    int arr[SIZE];
    int test[SIZE];
    int msec1, msec2;


    // declare thread variables
    pthread_t thread1;
    pthread_t thread2;

    // create threads
    pthread_create(&thread1, NULL, substitute1, arr);
    pthread_create(&thread2, NULL, substitute2, arr);

    // wait untill the two threads do all their work
    while(arr[SIZE/2 - 1] != 0x00de) {/*printf("arr[%d] = %x\n", SIZE/2 - 1, arr[SIZE/2 -1]);*/};
    while(arr[SIZE-1] != 0x00de) {/*printf("arr[%d] = %x\n", SIZE-1, arr[SIZE-1]);*/};

    // and then join
    pthread_join(thread1, NULL);
    pthread_join(thread2, NULL);

    // convert clocks to milliseconds
    msec1 = difference1 * 1000 / CLOCKS_PER_SEC;
    msec2 = difference2 * 1000 / CLOCKS_PER_SEC;

    printf("Multithreading1 : %d ms\n", msec1);
    printf("Mulththreading2 : %d ms\n", msec2);

    // here's the single-threading
    single_thread(test);

    return 0;
}

void single_thread(int *arr) 
{
    int msec = 0, i = 0;

    // declare initial clock
    clock_t single_before = clock();

    for(i=0;i<SIZE;i++)
    {
        arr[i] = 0x00de;
    }

    difference = clock() - single_before;

    // convert clocks to milliseconds
    msec = difference * 1000 / CLOCKS_PER_SEC;
    printf("Singlethreading : %d ms\n", msec);

}

最佳答案

多线程程序的性能改进来自于在多个处理单元之间分配工作负载。因此,您的程序必须使用足够的处理器来证明分配工作负载的合理性。然而,您在这里所做的只是将数据写入内存,没有进行任何处理,因此您受到内存访问的约束,如here所述。 .

关于c - C 中的单线程与 pthread 的多线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49302861/

相关文章:

将 void* 转换为其他类型

c++ - Qt : reference to non-static member function must be called

c++ - boost::shared_ptr 在多线程中使用它安全吗?

c - 如何安全和/或快速地从 C 内存中的 n 个字节组成一个 int?

performance - 直接在源码中使用gobs,可以吗?

c - 执行 printf() 和 Segmentation Fault

c - 图表示——链表的链表

c - C 中的字体规范

java - Java 编译器会用常量优化对 Math.exp 的调用吗?

java - 在每个线程之间分配数字范围