C Pthreads问题,无法传递我想要的信息?

时间:2011-04-14 00:43:28

标签: c arrays function pthreads startup

所以我试图让它成为线程启动函数打开一个通过命令行给出的文件,每个线程一个文件,但我还需要启动函数来获取我的结果数组。所以基本上我需要得到一个字符串(文件名)和一个2D数组的结果到我的启动线程一些如何,我彻底困惑。

任何人都有任何提示或想法?感谢。

#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include "string.h"


void* func(void *args);

int main(int argc, const char * argv[])
{
    int nthreads = 0;
    int i = 0;
    long **results;

    printf("Enter number of threads to use:\n> ");
    scanf("%d", nthreads);

    pthread_t threadArray[nthreads];

    // results 2d array; 3 rows by nthreads cols
    results = malloc((nthreads*4) * sizeof(long *));   

    for(i = 0; i<nthreads; i++) {
       pthread_create(&threadArray[i], NULL, wordcount, HELP!!!!); 
    } 

    for(i = 0; i<nthreads; i++) {
       pthread_join(threadArray[i], NULL);
    } 

    pthread_exit();
}

void * func(void *arguments)
{     
     FILE *infile = stdin;
     infile = fopen(filename, "rb");    

     fclose (infile);
}

2 个答案:

答案 0 :(得分:2)

通常,声明并初始化包含线程数据的结构,并将指向该结构的指针作为线程参数传递。

然后,线程函数将void*强制转换回结构指针,并具有数据。

请记住,当线程被调度时,该结构的生命周期仍然需要有效(这意味着如果它是局部变量则需要非常小心)。正如Jonathan Leffler指出的那样,将每个线程传递给它自己的结构实例,或者在重用它时要非常小心。否则,如果在线程完成之前结构被重用,则线程可以读取针对不同线程的数据。

管理这些问题的最简单方法可能是malloc()每个线程的结构,初始化它,将指针传递给线程,并在完成数据时让线程free()

答案 1 :(得分:1)

pthread_create的最后一个参数可以是您想要的任何对象,例如您可以拥有:

struct ThreadArguments {
    const char* filename;
    // additional parameters
};

void* ThreadFunction(void* arg) {
    CHECK_NOTNULL(arg);
    ThreadArguments* thread_arg = (ThreadArguments*) arg;
    // now you can access the other parameters through this thread_arg object
    // ...
}

// ...
ThreadArguments* arg = (ThreadArguments*) malloc(sizeof(ThreadArguments));
ret = pthread_create(&thread_id, attributes, &ThreadFunction, arg);
// make sure to check ret
// ...
pthread_join(thread_id);
free(arg);