此多个void指针函数如何工作?

时间:2018-12-22 09:34:40

标签: c pointers void-pointers

我有一个有关在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));

感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

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

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));

但是由于这都是错误的,所以这并不重要。

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