我正在做一个作业,我必须用pthreads
C处理一些图像。
我具有以下结构:
typedef struct {
int type;
int width;
int height;
int max_value;
int *input;
}image;
和
typedef struct {
int id; // thread id
image *in; //input image
}ptf_arguments;
我还有一个函数,我尝试实例化一个structure_b数组并为每个结构分配一个给定structure_a的参数
void resize(image *in, image * out) {
int i;
pthread_t tid[num_threads];
ptf_arguments *arguments[num_threads];
arguments[0]->in->input = (int *)malloc(in->width * in->height * sizeof(int));
arguments[0]->in = in; // HERE
printf("First thread should have id = %d. In image of (%d)\n", arguments[0]->id, arguments[0]->in->width); //here
for(i = 0 ; i < num_threads; i++) {
pthread_create(&(tid[i]), NULL, resize_thread_function, &(arguments[i]));
}
}
1)我不太了解结构,我需要有人向我解释如何将输入/输出图像传递给ptf_arguments结构,以便将其传递给pthreads函数。
2)我需要为图像结构分配内存吗?
3)我是否需要为ptf_arguments结构的图像结构内的int
数组分配内存?
谢谢
答案 0 :(得分:0)
当我阅读代码时,看到了
ptf_arguments *arguments[num_threads];
arguments[0]->in->undefined behavior
在取消引用之前,需要将in
指向有效的image
结构。最简单的方法可能是将标记为//HERE
的行移到上一行的上方。
是的,您还需要分配int
的数组,并将input
结构的image
成员指向该内存。不用说,您需要为每个ptf_arguments
对象(而不仅仅是第一个)进行初始化和分配。
我认为您传递单个ptf_arguments
对象地址的语法很好。
答案 1 :(得分:0)
结构基本上是您不能更改其子部分的对象。
它最像一个Javascript变量。如果变量是纯文本,则用点varname.subpartname
来访问其子部分;如果是指针,则用箭头varname->subpart
来访问它的子部分。
结构是变量类型。您不必为它们分配内存(除非使用指针...)
每个子部分必须根据其类型进行初始化。因此,指针子部分必须malloc
完全与任何指针一样,或使用现有指针进行定义。
void resize(image *in, image * out) {
pthread_t tid[num_threads];
ptf_arguments *arguments[num_threads];
// arguments[0]->in->input = malloc(in->width * in->height * sizeof(int));
//The preceding line is useless (and also using an uninitialized item). You already have a complete pointer.
arguments[0]->in = in; // HERE
printf("First thread should have id = %d. In image of (%d)\n", arguments[0]->id, arguments[0]->in->width); //here
for(int i = 0 ; i < num_threads; i++) {//Since you only use int i here, you can declare it in the for condition
pthread_create(&(tid[i]), NULL, resize_thread_function, &(arguments[i]));
}
}
答案 2 :(得分:0)
1)我不太了解结构,我需要有人向我解释如何将输入/输出图像传递给ptf_arguments结构,以便将其传递给pthreads函数。
如果每个线程需要1个结构,请使用pthread_create
参数按地址将其传递到arg
。就像您已经尝试过的:&(arguments[i])
。不过,您可能只想做arguments[i]
,因为这是一个指针。实际上,您不是在传递地址分配的数据,而是传递本地指针的地址,这是错误且错误的。
重要提示:永远不要将指向局部变量的指针传递给线程!需要使用静态存储持续时间或通过动态分配来分配变量。
如果您没有“很好地理解结构”,则在继续学习诸如多线程之类的高级主题之前,您应该研究它们并进行更多练习。通常,您不能通过反复试验来编程,实际上您需要知道每行键入的内容。没有“抓住机会”。
2)我是否需要为图像结构分配内存?
是的。这是您的代码无法正常工作的另一个原因。 ptf_arguments *arguments[num_threads];
只是一个指针数组,没有分配用于实际数据的内存。
3)我是否需要为ptf_arguments结构的图像结构内的int数组分配内存?
是的
还请记住在使用完所有内存后free
。除非先释放先前使用的资源,否则称为“调整大小”的功能可能不应分配资源。