【问题标题】:Should the thread function return 0?线程函数是否应该返回 0?
【发布时间】:2013-08-12 22:51:56
【问题描述】:

我有这个 void 函数,带有指向我的线程的指针。当我去编译时,我收到警告:“控制到达非无效函数的结尾”。如果我这样做了

void mythread (void *arg)

函数 i 将解决编译器给出的警告,但会得到一个新的警告,上面写着:

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

【问题讨论】:

  • 这里的每个问题都在寻找编码建议。你能把你的标题更具体吗?
  • 感谢格式编辑。是的,我知道,臭名昭著的标题。我尝试了 5 个不同的标题,只有一个成功了。不确定是否必须通过网站破解标题来提出一个简单的问题。
  • 那么,我如何将其标记为已解决? (感谢大家的帮助)
  • 您可以通过单击旁边的勾号来标记对您帮助最大的答案 - 请参阅 meta.stackexchange.com/questions/5234

标签: c unix posix gcc-warning


【解决方案1】:

在函数末尾添加return 0 是正确的做法。函数签名是这样的,它应该返回一个值。 pthread 库代码将期望返回一个返回值。将线程函数转换为错误的签名会导致未定义的行为。

您的代码可以看到调用pthread_join() 后的返回结果。您可以使用0 来表示成功。如果您不满意,您可以选择其他值。

【讨论】:

    【解决方案2】:

    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),以使函数指针类型兼容。

    【讨论】:

    • 返回0时会不会自动转成void *指针?
    【解决方案3】:

    “然后,我把 return 0; 在“mythread”函数的末尾,它编译。但我不确定这是否正确?建议?我是一个新手程序员,试图学习 POSIX 系统服务编程。”

    是的。 pthread_create 需要传递一个指向过程的指针,该过程接受一个 void 指针并返回一个 void 指针。查看原型(来自手册页)

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

    你现在能认出 start_routine 的类型了吗?

    【讨论】:

      猜你喜欢
      • 2019-05-22
      • 2018-04-13
      • 2017-09-10
      • 1970-01-01
      • 2016-04-04
      • 1970-01-01
      • 2015-04-29
      • 1970-01-01
      • 2019-10-01
      相关资源
      最近更新 更多