,例如,在Python中,如果您想将几件事传递到一个参数中,则可以通过以下元素进行元素:
thread_create(v, w, x, (y, z))
我有一个想法将一系列指针传递给我想在其他功能中访问的东西,但它们具有不同的类型。有没有办法制作一系列空隙指针或类似的东西? 论点是void*类型,这是我真的不熟悉的概念。
C具有静态键入,其类型系统没有结构性聚合类型,因此您需要声明要通过的数据类型。说您想通过整数和角色。
typedef struct {
int y;
char *z;
} thread_param_t;
当您调用线程创建函数时,您需要创建此类型的对象并将指针传递给它。
thread_param_t param = {42, "hello"};
pthread_create(thread, attr, entry_point, ¶m);
…
pthread_join(thread, NULL);
运行线程代码的函数采用类型
void*
的参数。什么是
void*
?这是在C中进行多态性的一种方法。指向指向
void
的指针是一个没有说明其指向的指针。除了将其传递到其他类型的指针外,它不能直接使用,但是可以将其转换为无效的指针,反之亦然。例如,第四个参数为pthread_create
具有类型void*
的类型,上面我传递了类型thread_param_t*
的参数。
void* entry_point(void *param_arg) {
thread_param_t *param = param_arg;
printf("entry_point called with y=%d and z=%s\n", param->y, param->z);
…
}
注意,C在运行时不会随身携带类型信息。可以将指针转换为
void*
并返回原始类型是可以的。将指针转换为void*
,然后转换为另一种指针,但是如果您不小心这样做,您将不会得到一个很好的例外,如果幸运的话,您会崩溃如果您不这样做,记忆损坏或其他难以删除的行为。
加上,您需要管理参数对象使用的内存。上面,我展示了如何将参数对象声明为局部变量。如果将其放入函数中,则该对象仅存在直到函数返回。 (如果在一个块中声明
param
,则仅在块的闭合支架之前才有效。)如果函数等待线程完成访问参数对象的情况,这是可以的 - 上方我显示它正在等待线程结束。但是通常这还不够好,因此您需要动态分配内存。
thread_param_t *param;
param = malloc(sizeof(*param));
if (param == NULL) …;
pthread_create(thread, attr, entry_point, ¶m);
由于对象是动态分配的,您需要在某个时候在其上调用free
,大概是在使用对象完成后。
您无法创建一系列voids,因为void不是类型的说明符。数组必须具有指定的类型(例如,char,unsigned int等),而void的作用是它抽象了指针的类型,以便您可以将指针转换回您想要的任何类型。 一个参数使用类型转换e时传递多个值的简便方法。 G.
entry_point
unsigned long param = {(unsigned long)y, (unsigned long)z};
thread_create(v, w, x, (void *)param);
变量的type应该足够大,可以在其中存储类型的元素(不要使用
param
数组来存储int
struct