为什么我们在pthread_create中将函数参数作为void*传递?

Muz*_*ain 3 c++ multithreading operating-system

我刚刚开始了一个操作系统课程.所以我要问的问题可能是一个幼稚的问题,但没关系.我目前正在学习多线程.这是我的问题:每当我们使用pthread_create()创建一个线程时,为什么我们需要传递我们希望我们的线程在void*类型中运行的函数的参数?

例如,请考虑以下代码.

void *test(void* data)
{
   ...
}

int main()
{
      int temp;
      pthread_t tid;
      pthread_attr_t attr;

      pthread_attr_init(&attr);
      pthread_create(&tid, &attr, test, (void*)&temp);
}
Run Code Online (Sandbox Code Playgroud)

所以,在这里,

pthread_create(&tid, &attr, test, (void*)&temp);
Run Code Online (Sandbox Code Playgroud)

为什么我们需要将整数类型转换为void*.为什么不直接传递整数?同样地,而不是

void* test(void* data);
Run Code Online (Sandbox Code Playgroud)

为什么不这样,

void* test(int data);
Run Code Online (Sandbox Code Playgroud)

Dev*_*lar 5

首先,pthread_create()是一个C函数,而不是C++,所以C++ 在这一点上可以做的所有事情- 例如使用模板的东西 - 是不可能的.C程序也想启动线程.

(实际上,较新版本的C++有自己的线程接口.)

所以,C

我们的想法是拥有一个通用接口,因此您可以将任何内容传递给任何要调用的函数pthread_create(),并返回任何内容.

您不能传递值,因为您不知道参数的大小.难道int,doublestruct something?所以你需要通过指针传递.

既然你不知道参数的类型(和返回值),你也可以使用void *"匿名"指针类型.在调用线程函数(test()在本例中)中,您确实知道参数的类型和返回值,因此您可以void *根据需要进行转换.