这是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 *)
有人可以告诉我这是什么意思吗?
答案 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:
在以下情况下该行为未定义:
...
- 指针用于调用类型与所引用类型不兼容的函数。
“未发现可见问题的作品”由“未定义的行为”涵盖。还涵盖了“程序崩溃”。