所以我试图让它成为线程启动函数打开一个通过命令行给出的文件,每个线程一个文件,但我还需要启动函数来获取我的结果数组。所以基本上我需要得到一个字符串(文件名)和一个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);
}
答案 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);