2013-08-12 2 views
1

У меня есть эта функция void с указателем на мой поток. когда я иду на компиляцию, я получаю предупреждение: «control достигает конца не-void функции». Если яЕсли функция потока возвращает 0?

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 ", и он компилируется. Но я не уверен, правильно ли это делать?

Рекомендации? Я программист newb, пытаясь изучить программные сервисы системы 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; 
} 
+1

Каждый вопрос здесь ищет рекомендации по кодированию. Можете ли вы сделать свой титул более конкретным? – Blorgbeard

+0

Спасибо за редактирование форматирования. да, я знаю, вонючий титул. Я попробовал 5 разных титров, только этот пробился. Не уверен, что вам нужно размещать заголовки, чтобы задать простой вопрос. – j0h

+0

Итак, как я могу отметить это как решение? (Спасибо всем за помощь) – j0h

ответ

5

Добавление return 0 к концу функции является правильным, что нужно сделать. Подпись функции такова, что она должна возвращать значение. Код библиотеки pthread ожидает возвращения возвращаемого значения. Приведение функции потока к неправильной сигнатуре приведет к неопределенному поведению.

Ваш код может видеть результат возврата после звонка pthread_join(). Вы можете использовать 0 для достижения успеха. Если это вас не удовлетворяет, вы можете выбрать другое значение.

1

«Итак, я положил return 0, в конце функции« mythread », и он компилируется. Но я не уверен, правильно ли это делать? Совет? Я программист newb, пытаюсь для изучения программного обеспечения системы POSIX ».

Да, это так. pthread_create необходимо передать указатель на процедуру, которая принимает один указатель void и возвращает указатель void. Посмотрите на прототип (со страницы руководства)

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

Можете ли вы узнать тип start_routine сейчас?

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), чтобы сделать типы указателей функции совместимы.

Смежные вопросы