C 中的 Void 参数

Void Parameters in C

我正在使用 pthreads 并使用一个名为 'runner' 的函数来指定在线程上使用哪些方法。

这是我的转轮函数:

void *runner(void* param){
    int* parm = (int*) param;

if(parm == 1){
    MergeSort(intArr, 0, (fileLen/2));
}

if(parm == 2){
    MergeSort(intArr, (fileLen/2)+1, fileLen - 1);
}
if(parm == 3){
    Merge(intArr, 0, (fileLen/2), fileLen - 1);

}
pthread_exit(0);
}

我的问题是当我在 main 中创建这个线程时,我得到一个编译器错误:"warning: comparison between pointer and integer"。

pthread_create(&tid1, &attr1, runner, 1);

我一直在尝试不同的方法来转换整数,但我仍在努力寻找正确的方法。

第一种方法是

  1. 创建一个 int 对象 param 来保存您要传递的值。
  2. 获取指向该对象的指针:&param
  3. int * 指针转换为 void * 指针。
  4. void * 指针传递给 pthread_create

即创建线程时,做

int param = 1;
int *pparam = &param;
void *vpparam = (void *) pparam;
pthread_create(&tid1, &attr1, runner, vpparam);

以上可以压缩成

int param = 1;
pthread_create(&tid1, &attr1, runner, &param);

做同样的事情。

现在,在线程函数中,我们必须反向执行所有操作

  1. 在线程函数中接收到那个void *指针
  2. 将收到的void *指针转换为int *类型
  3. 取消引用指针以检索 int

所以,在线程函数中我们做

void *runner(void* param) {
  int *pparam = (int *) param;
  int parm = *pparam;

  if (parm == 1){
    ...
  }
  ...
}

或者更简洁

void *runner(void* param) {
  int parm = *(int *) param;
  ...

请注意,在这种方法中,线程函数将取消引用一个指针,以访问我们在 pthread_create 调用之前创建的同一个 int param 对象。只要线程运行,保持 int 对象处于活动状态通常很重要。


或者,您可以尝试更 "hackerish" 的方法:将所需的 int 值转换为 void * 类型并将其直接传递给 pthread_create

void *vparam = (void *) (uintptr_t) 1;
pthread_create(&tid1, &attr1, runner, vparam);

并在线程函数中将接收到的void *指针转换回int类型

void *runner(void* param) {
  int parm = (int) (uintptr_t) param;

  if(parm == 1){
    ...
  }
  ...
}

前一种方法在直觉上更简洁并且通常更可扩展,如果有一天您想要传递比单纯的 int.

更重的东西

I've been trying different ways to cast the integer but I'm still struggling to find the correct way

试试这个: pthread_create(&tid1, &attr1, runner, (void*)(intptr_t)1);

并在线程函数中:

    void *runner(void* param){
        int parm = (int)(intptr_t)param;

pthread_create 期望它的第四个参数是 void*,对应于 runnervoid* 输入,但你传递给它的是 int .相反,创建一个 int 变量并将其 地址 作为第四个参数传递,例如:

int param = 1;
pthread_create(&tid1, &attr1, runner, &param);

该函数接受一个void*,一个空指针。在 C 中,void 指针用于指向内存中未指定的类型。这是在 C++ 发明模板之前用于泛型的东西

  std::vector<int> vector;

因为参数是指针,正如 AnT 所说,您应该将指针传递给函数。上面的代码看起来很有效。如果你愿意,你可以投

   pthread_create(&tid1, &attr1, runner, (void*)1);