使用多个线程平方数字

时间:2016-03-01 00:24:23

标签: c multithreading pthreads

我尝试编写一个程序,通过创建8个线程来对齐数字1-10,000,每个线程将轮流对齐一个数字。意味着一个线程将方形1,另一个将方形2等,直到所有线程都对齐一个数字。然后一个线程将9等等,一直到10,000。我的代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
#include <pthread.h>
#include <sys/types.h>

#define NUMBER_OF_THREADS 8
#define START_NUMBER 1
#define END_NUMBER 10000

FILE *f;

void *sqrtfunc(void *tid) { //function for computing squares
    int i;
    for (i = START_NUMBER; i<= END_NUMBER; i++){
        if ((i % NUMBER_OF_THREADS) == pthread_self()){ //if i%8 == thread id
            fprintf(f, "%lu squared = %lu\n", i, i*i); //then that thread should do this
        }
    }
}

int main(){
    //Do not modify starting here
    struct timeval start_time, end_time;
    gettimeofday(&start_time, 0);
    long unsigned i;
    f = fopen("./squared_numbers.txt", "w");
    //Do not modify ending here

    pthread_t mythreads[NUMBER_OF_THREADS]; //thread variable
    long mystatus;

    for (i = 0; i < NUMBER_OF_THREADS; i++){ //loop to create 8 threads
        mystatus = pthread_create(&mythreads[i], NULL, sqrtfunc, (void *)i);
        if (mystatus != 0){ //check if pthread_create worked
            printf("pthread_create failed\n");
            exit(-1);
        }
    }
    for (i = 0; i < NUMBER_OF_THREADS; i++){
        if(pthread_join(mythreads[i], NULL)){
            printf("Thread failed\n");
        }
    }
    exit(1);

    //Do not modify starting here
    fclose(f);
    gettimeofday(&end_time, 0);
    float elapsed = (end_time.tv_sec-start_time.tv_sec) * 1000.0f + \
                    (end_time.tv_usec-start_time.tv_usec) / 1000.0f;
    printf("took %0.2f milliseconds\n", elapsed);
    //Do not modify ending here
}

我不确定我的错误在哪里。我在main中创建了8个线程,然后根据它们的线程id(tid),我希望该线程对数字进行平方。截至目前,输出文件中没有打印任何内容,我无法弄清楚原因。我的tid比较没有做任何事吗?任何提示都表示赞赏。谢谢你们。

1 个答案:

答案 0 :(得分:0)

首先,你故意将参数传递给每个线程,以便它知道它是哪个线程(从0到7)这很好,但是你不再在线程内部使用它(这导致了一个可能的你遇到的困惑)

其次,正如你在解释算法应该如何进行的说法中所说,你说每个线程必须对一组不同的数字进行平方,但是所有这些都要对同一组数字进行平方(实际上)整套数字)

你有两种方法:让每个线程对数字进行平方,然后进行下一个,进一步的8个位置(所以算法是你的解释中描述的算法)或你给出不同的集合(每个1250个连续数字)和让每个线程动作都是独立的间隔。

那就是说,你必须重建你的for循环来做两个中的一个:

for (i = parameter; i < MAX; i += 8) ...

for (i = 1250*parameter; i < 1250*(parameter+1); i++) ...

这样,您将使用一组不同的输入数字运行每个线程。