如何解决C Pthreads问题,无法传递我想要的信息?
| 因此,我试图通过线程启动功能打开一个通过命令行指定的文件,每个线程一个文件,但是我还需要启动功能来获取结果数组。因此,基本上,我需要为启动线程获取一个字符串(文件名)和一个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);
}
解决方法
通常,将声明并初始化包含线程数据的结构,然后将指向该结构的指针作为线程参数传递。
然后,线程函数将“ 1”强制转换回结构指针并具有数据。
请记住,在安排线程时,该结构的生存期仍然需要有效(这意味着如果它是局部变量,则需要非常小心)。而且正如乔纳森·莱夫勒(Jonathan Leffler)所指出的那样,传递每个线程是它自己的结构实例,或者非常小心如何复用它。否则,如果结构在线程完成处理之前被重用,则线程可能会读取打算用于其他线程的数据。
解决这些问题的最简单方法可能是为每个线程“ 2”构造一个结构,对其进行初始化,将指针传递给该线程,并在数据处理完毕后让线程“ 3”对其进行处理。
,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);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。