将数组传递给pthread_create的正确方法是什么?我所看到的每个地方都是(void*)myArray)
为什么会这样?为什么我要放void*
?数组名称不足以像其他语言一样吗?作为一个函数论证为什么void *add_first_quat(void *a)
为什么我们放void *
?
答案 0 :(得分:4)
(void*)myArray)
为什么会这样?为什么我要放void*
?数组名称是 还不像我们用其他语言做的那样吗?
传递给线程函数时没有必要转换数组。这可能是由于旧习惯或缺乏理解void *
与任何其他数据指针兼容。演员阵容充其量是多余的,可能会导致最坏的错误。
这是传递数组的正确方法:
pthread_create(&thrd_id, 0, thread_func, array);
作为函数论证为什么
void *add_first_quat(void *a)
为什么我们是 放void *
?
因为那是pthreads库的线程函数所期望的。原因是它允许您将任何数据指针传递给线程函数(又名"泛型"指针类型)。想象一下,你有3个线程(相同的线程函数)作用于不同类型的" struct"数据
答案 1 :(得分:3)
这是因为在函数pthread_create
的第四个参数所指定的pthread使用的函数中只能有一个参数,正如我们可以从{{1 }} 强>
pthread_create
这个参数必须像 general 一样,因为每次使用该函数时都可以提供不同的参数。 无效指针实际上是无类型指针,然后可以使用它们,但是它们应该由具有适当的强制转换的函数使用。
void指针,也称为通用指针,是一种特殊类型的指针,可以指向任何数据类型的对象! void指针被声明为普通指针,使用void关键字作为指针的类型:
由于您的唯一参数是void指针,因此每次都需要将参数转换为void指针。这不是必需的,但至少是一种习惯,与使用 int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
void *(*start_routine) (void *), void *arg);
时的演员有点类似。
您可能会问,如果您想传递许多参数而不仅仅是一个参数,该怎么办?解决这个问题的典型方法是将所有参数封装到 struct 中,然后传递该结构。
答案 2 :(得分:2)
您的start_routine
将使用指针,但它不关心在此地址找到的数据类型。因此,它需要void *
并允许您随后使用它。
在变量名称之前使用强制转换(void *)
只会在编译程序时阻止警告。
答案 3 :(得分:2)
在C中,void*
只是一个占位符,意味着"任何指针"。你的实际数组很可能有不同的类型,这就是为什么你必须强制转换它以便pthread_create
可以接受这个参数。
答案 4 :(得分:2)
底层操作系统提供线程支持,操作系统不关心用什么语言编写它运行的代码。 OS线程API调用必须独立于语言功能,因此“CreateThread”调用通常设计为仅将一个指针复制到新线程的堆栈,以便在最终运行时由线程函数进行检索。由语言/代码决定是否以适当且正确的方式创建新线程以使用该指针。在C / pthreads的情况下,此约束表面为void *指针。
我所看到的每个地方都是(void *)myArray
好吧,我经常看到指向动态分配结构的指针,或者在OO语言的情况下,指向对象实例指针/ ref。我不明白为什么数组指针会是任何类型的'偏爱'类型。