我有文件压缩器/解压缩器的代码,并且我必须更改代码以使其并发。我有一个称为“工作者”的函数,该函数从入队队列中获取大块,通过进程(压缩或解压缩)运行它们,然后将其发送到出队队列。
这是'worker'函数头(带有单独的参数):
void worker(queue in, queue out, chunk (*process)(chunk));
如果我在struct中有参数,这将是'worker'函数:
void worker(void *ptr) {
chunk ch, res;
struct args *args = ptr;
while(q_elements(args->in) > 0) {
ch = q_remove(args->in);
res = args->process(ch);
free_chunk(ch);
q_insert(args->out, res);
}
}
和结构:
struct args {
int thread_num;
queue in;
queue out;
chunk (*process) (chunk);
};
现在,我的问题是:传递单独的参数或指向args类型的结构的指针有什么区别?
我应该期待有什么不同吗?我什么时候应该选择一个选项?
答案 0 :(得分:1)
在这种情况下,具有指向结构的指针的好处是,在创建辅助函数时,通常会使用函数指针。可以为带有未指定参数编号和类型的参数的函数创建函数指针,但我不建议这样做。
例如,如果我们看看pthread_create
,它的原型是:
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
void *(*start_routine) (void *), void *arg);
在这里,start_routine
是辅助函数,arg
是传递给它的参数。如果没有这种方法,创建一个易于使用的框架几乎是不可能的。
传递单独的参数或指向args类型的结构的指针有什么区别?我应该期待有什么不同吗?我什么时候应该选择一个选项?
如上例所示,如果要使用pthread
,只需使用结构即可。
另一种用法是,如果您想隐藏程序员的实现细节。它有点像OOP。考虑使用此标头:
// foobar.h
struct data;
int getId(struct data *data);
void setId(struct data *data, int id);
现在,由于某种原因,您不希望程序员直接访问data
中的字段。因此我们将其实现隐藏在源文件中:
// foobar.c
struct data {
int id;
// More fields
}
int getId(struct data *data) {
return data->id;
}
void setID(struct data *data, int id) {
data->id = id;
}
类似的推理可以用于辅助函数。
第三个原因可能是您有要传递的LOTS或参数。然后可以改用结构来提高可读性。