【问题标题】:How does this multiple void pointers function work?这个多个 void 指针函数是如何工作的?
【发布时间】:2018-12-22 09:34:40
【问题描述】:

我有一个关于在 C 中创建线程的示例代码。在我创建线程的部分,我不知道所有 void 指针的用途,以及它们的作用。

void* pthread_function(int thread_id) {
    pthread_mutex_lock(&mutex);
    printf("I'm thread number %d in mutual exclusión\n",thread_id);
    pthread_mutex_unlock(&mutex);
    pthread_exit(NULL);
}
int main(int argc,char** argv) {
    // Init mutex
    pthread_mutex_init(&mutex,NULL);
    // Create threads
    pthread_t thread[NUM_THREADS];
    long int i;
    for (i=0;i<NUM_THREADS;++i) {
        pthread_create(thread+i,NULL,(void* (*)(void*))pthread_function (void*)(i));
    }

}

指针在这里是如何工作的?

pthread_create(thread+i,NULL,(void* (*)(void*))pthread_function (void*)(i));

感谢您的帮助。

【问题讨论】:

  • 您是否注意到应该返回指向 void 的指针的函数没有返回语句?我建议忽略这种代码并寻找其他地方。
  • 关注演员 (void* (*)(void*)) 和演员 pthread_function 以及它所采用的参数类型(以及它与原始演员的不同之处),以及最终演员的制作方式工作。将其与手册页中 pthread_create 的原型进行比较。
  • @DavidC.Rankin 我认为第一个 (void* ) 这在手册页中的 pthread_create 中很常见。我猜第二个 ( * ) 是指向 pthread_function 的指针。第三个(void*))是我不太明白的那个。
  • 这段代码甚至无法编译,并且由于多种原因通常写得不好。就像@Yunnosch 写的那样,找到一个更好的例子。
  • 好吧,我想我不应该在这上面浪费时间。我会寻找其他的例子。虽然我还是想了解(void* (*)(void*))背后的意图是什么。

标签: c pointers void-pointers


【解决方案1】:

线程函数应该具有以下签名:

void *thread_func(void *thread_param);

如果你有这样的功能,你可以用它创建一个线程,而不会出现这种铸造混乱:

void *thread_func(void *thread_param)
{
  printf("Success!\n");
  return NULL;
}

...
pthread_t thread_var;
int param = 42;
int result = pthread_create(&thread_var, NULL, thread_func, &param);

不幸的是,您示例中的线程函数没有正确的签名。 因此作者决定不修复它,而是用奇怪的演员表来解决问题。

函数的类型是(void*(*)(void*))。作者试图通过强制转换线程函数来入不敷出:

(void* (*)(void*))pthread_function

但是又引入了另一个错误:不是函数地址被转换而是函数被调用并且返回值被用于转换:

pthread_function (void*)(i)

这甚至不能编译,因为它是一个语法错误。应该是

pthread_function((void*)i)

或者它可能是这样的:

pthread_create(thread+i,NULL,(void* (*)(void*))pthread_function, (void*)(i));

但无论如何这都是错误的,这并不重要。

您最好再次搜索正确的线程创建示例。

【讨论】:

  • 谢谢。我不完全理解它,但我可以看到逻辑在哪里。我不知道为什么我的老师认为这是一个很好的例子......
猜你喜欢
  • 1970-01-01
  • 2023-01-10
  • 1970-01-01
  • 2018-10-21
  • 2011-06-28
  • 2011-05-30
  • 2014-04-10
  • 1970-01-01
  • 2021-01-20
相关资源
最近更新 更多