我有这个void函数,并带有指向我的线程的指针。当我去编译时,我得到警告:“控制到达非空函数的末尾”。如果我这样做
void mythread (void *arg)
和该函数,我将解决编译器给出的警告,但会收到一个新的警告,说:
TA.c:50:2: warning: passing argument 3 of ‘pthread_create’ from incompatible pointer type [enabled by default]
因此,我将return 0;
放在“ mythread”函数的末尾,并进行编译。但是我不确定这是否正确吗?
我正在尝试学习POSIX系统服务编程。我不确定该怎么办。
建议吗?我应该尝试键入强制转换参数3吗?如何编译程序并获得零警告?
#include <limits.h>
#include <pthread.h>
#include <stdio.h>
void *mythread (void *arg)
{
printf("This my Thread Maybe...\n");
}
int main()
{
pthread_t mythread_id;
pthread_attr_t mythread_attr;
size_t stack_size;
int detachstate;
pthread_attr_init (&mythread_attr);
pthread_attr_getdetachstate(&mythread_attr, &detachstate);
if(detachstate == PTHREAD_CREATE_DETACHED)
{
printf("Current Deteached state is Detached\n");
}
else
{
printf("Current Detached state is Joinable\n");
}
pthread_attr_setdetachstate (&mythread_attr, PTHREAD_CREATE_DETACHED);
pthread_attr_getdetachstate (&mythread_attr, &detachstate);
if(detachstate == PTHREAD_CREATE_DETACHED)
{
printf("NEW DETACHED STATE is determined to be deteched\n");
}
else
{
printf("NEW DETACHED STATE is Determine to be Joinable\n");
}
pthread_attr_getstacksize (&mythread_attr, &stack_size);
printf ("Default stack size is %d; minimum is %d\n", stack_size, PTHREAD_STACK_MIN);
pthread_attr_setstacksize (&mythread_attr, PTHREAD_STACK_MIN*2);
pthread_attr_getstacksize (&mythread_attr, &stack_size);
printf("NEW stack size is %d\n", stack_size);
pthread_create (&mythread_id, &mythread_attr, mythread, 0);
return 0;
}
在函数的末尾添加return 0
是正确的做法。函数签名应返回一个值。 pthread
库代码将期望返回一个返回值。将线程函数转换为错误的签名将导致未定义的行为。
您的代码可以在调用pthread_join()
之后看到返回结果。您可以使用0
表示成功。如果您不满意,则可以选择其他值。
documentation for pthread_create表示它需要一个指向以void *
并返回void *
作为其第三个参数的函数的指针:
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
void *(*start_routine) (void *), void *arg);
这就是当函数返回void
而不是void *
时收到“不兼容的指针类型”警告的原因-它成为函数指针的另一种类型。
如您所述,一个好的解决方案是使函数返回一个虚拟的void *
,例如return 0
(或可能不太混乱的return NULL
),以使函数指针类型兼容。
“”然后,我在“ mythread”函数的末尾放置return 0;并进行编译。但是我不确定这是否正确吗?建议?我是一名新手程序员,正在尝试学习POSIX系统服务编程。“
是的。 pthread_create需要传递一个指向过程的指针,该过程采用一个void指针并返回一个void指针。查看原型(来自手册页)
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
void *(*start_routine) (void *), void *arg);
您现在可以识别start_routine的类型吗?