Несколько аргументов для функции, вызываемой pthread_create ()? - PullRequest
80 голосов
/ 30 августа 2009

Мне нужно передать несколько аргументов функции, которую я хотел бы вызвать в отдельном потоке. Я прочитал , что типичный способ сделать это - определить структуру, передать функции указатель на нее и разыменовать ее для аргументов. Однако я не могу заставить это работать:

#include <stdio.h>
#include <pthread.h>

struct arg_struct {
    int arg1;
    int arg2;
};

void *print_the_arguments(void *arguments)
{
    struct arg_struct *args = (struct arg_struct *)args;
    printf("%d\n", args -> arg1);
    printf("%d\n", args -> arg2);
    pthread_exit(NULL);
    return NULL;
}

int main()
{
    pthread_t some_thread;
    struct arg_struct args;
    args.arg1 = 5;
    args.arg2 = 7;

    if (pthread_create(&some_thread, NULL, &print_the_arguments, (void *)&args) != 0) {
        printf("Uh-oh!\n");
        return -1;
    }

    return pthread_join(some_thread, NULL); /* Wait until thread is finished */
}

Выходные данные для этого должны быть:

5
7

Но когда я запускаю его, я на самом деле получаю:

141921115
-1947974263

Кто-нибудь знает, что я делаю не так?

Ответы [ 5 ]

66 голосов
/ 30 августа 2009

Потому что вы говорите

struct arg_struct *args = (struct arg_struct *)args;

вместо

struct arg_struct *args = arguments;

16 голосов
/ 15 февраля 2012

использование

struct arg_struct *args = (struct arg_struct *)arguments;

вместо

struct arg_struct *args = (struct arg_struct *)args;
4 голосов
/ 03 марта 2011

main() имеет свои собственные переменные потока и стека. либо выделите память для «args» в куче, либо сделайте ее глобальной:

struct arg_struct {
    int arg1;
    int arg2;
}args;

//declares args as global out of main()

Затем, конечно, измените ссылки с args->arg1 на args.arg1 и т. Д.

2 голосов
/ 06 сентября 2014

Использование:

struct arg_struct *args = malloc(sizeof(struct arg_struct));

И передайте эти аргументы так:

pthread_create(&tr, NULL, print_the_arguments, (void *)args);

Не забывайте бесплатные арги! ;)

0 голосов
/ 13 апреля 2016

Аргументы print_the_arguments являются аргументами, поэтому вы должны использовать:

struct arg_struct *args = (struct arg_struct *)arguments. 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...