C pthread создание структуры в цикле for - PullRequest
0 голосов
/ 12 ноября 2018

В настоящее время я пытаюсь создать новые объекты структуры во время цикла for. Они передаются в новую функцию, которая обрабатывает их.

int start_i = 0;
for(int t = 0 ; t < t_max ; t++) {
    // Arguments for the threads.
    struct arguments* arguments1 = malloc(sizeof(struct arguments));
    arguments1->old_array = old_array;
    arguments1->current_array = current_array;
    arguments1->next_array = next_array;
    arguments1->i_start = start_i;

    if (t == t_max - 1) {
        arguments1->i_end = i_max;
    }
    else {
        arguments1->i_end = start_i + i_size - 1;
        start_i += i_size;
    }

    printf("%d\n", &arguments1);

    pthread_create(&thread_ids[t], NULL, &help, (void*)arguments1);
}

Как видите, я использую pthreads. Проблема в том, что вместо того, чтобы все объекты были новыми, они просто перезаписывают старый, так как местоположение адреса, которое я печатаю, является тем же самым. Мне нужно, чтобы объекты были новыми, потому что в противном случае разные потоки будут работать с общими данными.

1 Ответ

0 голосов
/ 12 ноября 2018

Переменная arguments1 является указателем, и ее адрес (&arguments1) не будет меняться в указанном вами коде. Однако то, что он указывает на , будет меняться каждый раз, когда вы звоните malloc. Поскольку вы передаете arguments1 значение (не &arguments1 - его адрес) в качестве аргумента pthread_create, вы передаете правильную вещь (указатель на вновь выделенная структура) для вашей функции потока. Чтобы увидеть изменяющееся значение в вашем цикле, используйте:

printf("%p\n", arguments1);

Обратите внимание, что %p - это правильный способ печати значения указателя, а не %d.

...