pthread_create在第三个参数上需要哪种类型

时间:2018-12-09 14:12:42

标签: c linux pthreads

这是pthread_create的正确用法,没有警告:

#include <pthread.h>
#include <stdio.h>
void  *check(void *temp) {
    int* i = (int *)temp;
    printf("%d\n", *i);
}
int main(void) {
    pthread_t check_thread;
    int i = 1;
    pthread_create(&check_thread, NULL, check , (void  *)&i);
    pthread_join(check_thread, NULL);
    return 0;
}

但是以下代码也可以正常运行,只需将void * check更改为void check:

#include <pthread.h>
#include <stdio.h>
void check(void *temp) {
    int* i = (int *)temp;
    printf("%d\n", *i);
}
int main(void) {
    pthread_t check_thread;
    int i = 1;
    pthread_create(&check_thread, NULL, check, (void  *)&i);
    pthread_join(check_thread, NULL);
    return 0;
}

如果我将check更改为&check,它也可以正常运行

#include <pthread.h>
#include <stdio.h>
void check(void *temp) {
    int* i = (int *)temp;
    printf("%d\n", *i);
}
int main(void) {
    pthread_t check_thread;
    int i = 1;
    pthread_create(&check_thread, NULL, &check, (void  *)&i);
    pthread_join(check_thread, NULL);
    return 0;
}

我看到pthread_create的主要参数是:void *(* start_routine)(void *)
有人可以告诉我这是什么意思吗?

3 个答案:

答案 0 :(得分:1)

C标准的要点是编写可在任何兼容平台上运行的可移植代码。它可以在您的平台上运行而没有可见错误,这一事实并不意味着它可以在其他平台上运行。失败的原因可能是pthread_join可能尝试使用返回值访问硬件寄存器。

答案 1 :(得分:1)

它不过是一个函数指针。让我们分解一下。 无效*(* start_routine)(无效*)

void* -> return type of function
start_routine -> function pointer name 
void* -> argument type

您传递的函数地址将分配给函数指针start_routine,并且start_routine将作为新线程从内核中调用。

答案 2 :(得分:1)

the POSIX standard for pthread_create()

  

简介

#include <pthread.h>

int pthread_create(pthread_t *restrict thread,
       const pthread_attr_t *restrict attr,
       void *(*start_routine)(void*), void *restrict arg);

这意味着pthread_create()的第三个参数必须是void *(*start_routine)(void*)形式的函数指针。传递的函数指针必须引用一个函数 声明并定义为

void *start_routine( void *arg )
{
    void *ptr = ...;

    ...
    return( ptr );
}

期间。讨论结束。句号。

您通过不将类型void *(*start_routine) (void *)的函数作为第三个参数传递给pthread_create()来调用undefined behavior

J.2 Undefined behavior, paragraph 1 of the C standard

  

在以下情况下该行为未定义:

     

...

     
      
  • 指针用于调用类型与所引用类型不兼容的函数。
  •   

“未发现可见问题的作品”由“未定义的行为”涵盖。还涵盖了“程序崩溃”。