我有一个有关在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));
感谢您的帮助。
答案 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, ¶m);
不幸的是,示例中的线程函数没有正确的签名。 因此,作者决定不对其进行修复,而要弄乱怪异的演员。
函数的类型为(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));
但是由于这都是错误的,所以这并不重要。
您最好再次搜索正确的线程创建示例。