IIC2333 / foro-2019-1

Foro oficial del curso IIC2333 - Sistemas Operativos y Redes, semestre 2019-1.
2 stars 0 forks source link

Duda C: problema pasando argumentos a un thread #47

Closed fdominguezclaro closed 5 years ago

fdominguezclaro commented 5 years ago

Hola!

Quiero pasarle 2 argumentos a un thread, pero al compilarlo me arroja un warning que no he podido sacar.

typedef struct arg_struct {
    // Defino argumentos de la estructura
} Args;

Args* args_init(char** array, int array_length) {
    // Guardo la estructura en el heap y seteo sus atributos
    return args;
}

void mapper(void* args) {
    Args *data = args;
    puts("I'm a thread");
}

pthread_t init_mapper_thread(char** array, int array_length) {
    pthread_t mapper_thread;
    puts("--- Creando thread ---");
    Args *args = args_init(array, array_length);
    pthread_create(&mapper_thread, NULL, mapper, args);
}

El warning es el siguiente:

src/utils/utils.c:44:42: warning: incompatible pointer types passing 'void (void *)' to parameter of type 'void * _Nullable (* _Nonnull)(void * _Nullable)'
      [-Wincompatible-pointer-types]
    pthread_create(&mapper_thread, NULL, mapper, args);
                                         ^~~~~~
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/usr/include/pthread.h:334:31: note: passing argument to parameter here
                void * _Nullable (* _Nonnull)(void * _Nullable),
                                            ^
src/utils/utils.c:46:1: warning: control reaches end of non-void function [-Wreturn-type]
}
Dunkan1 commented 5 years ago

segun yo deberia ser

void* args = args_init(array, array_length);

y despues castearlo

fdominguezclaro commented 5 years ago

Tampoco me funcionó de esa manera 😕

Dunkan1 commented 5 years ago

perdon era

void* args = (void*) args_init(array, array_length);
fdominguezclaro commented 5 years ago

Finalmente lo arreglé usando tu primera respuesta y cambiando la siguiente línea:

Args* args_init(char** array, int array_length) {

a

void* args_init(char** array, int array_length) {

Gracias por la ayuda!