Передача всего массива структур в Pthread_Create в C - PullRequest
1 голос
/ 26 февраля 2011

У меня небольшая проблема с этой проблемой.У меня есть массив, который содержит 2 структуры.Мне нужно передать этот массив в функцию потока и быть в состоянии получить доступ и манипулировать обе структуры в этом массиве.Все примеры, которые я просмотрел и нашел, обычно передают каждый элемент массива в pthread_create, но в контексте моей программы я могу одновременно вызывать только один экземпляр pthread_create, поэтому я не могу передать каждый элемент в массиве по одномуодним.Вот упрощенный код, который я сейчас рассматриваю (дайте мне знать, если вам нужна более важная информация):

typedef struct foo
{
    int a;
    char b[100];
}foo;


void *threadFunction(void *arr);
.
.
.
int main(int argc, char *argv[])
{
    foo temp1, temp2;
    //Somewhere between here temp1 and temp2 are initialized and filled
    foo arr[2];
    arr[0] = temp1;
    arr[1] = temp2;
    pthread_create(&thread, &attr, threadFunction, (void *)arr);
.
.
.
}
void *threadFunction(void *arr)
{       
    foo *temp = (foo *)malloc(2 * sizeof(foo));
    temp = (foo *)arr;
    .
    .
    .
    free(temp);
    pthread_exit(NULL);
}

Я также пытался просто сказать:

foo *temp = (foo *)arr;

Очевидное решение былоназначить каждый элемент в temp [] элементу в arr [], но это не работает.

В результате у меня есть доступ только к первому элементу в массиве temp, даже если я пытаюсь получить доступtemp [1], что имеет смысл, поскольку не похоже, что я назначаю второй элемент в arr [] чему-либо.

Я уверен, что упускаю что-то очевидное, но не могуКажется, я нашел это, и я не смог найти никакой соответствующей информации об этой конкретной ситуации.Спасибо за любую помощь.

1 Ответ

1 голос
/ 26 февраля 2011

Это включает приведение указателя void к типу указателя вашей структуры, а затем разыменование этого выражения указателя для получения элемента с определенным смещением:

*((foo *) arr); /* first element */
*((foo *) arr + 1); /* second element */

Редактировать: еще одна важная проблема - массив arr должен быть определен глобально, вне main. Поскольку вновь созданный поток будет иметь свое собственное пространство стека, доступ к стеку другого потока не очень безопасен.

...