Передача массива Struct в поток - PullRequest
0 голосов
/ 06 февраля 2020

Я пытаюсь передать весь массив структуры в поток, где мне нужен индекс для различения различных массивов в потоке.

typedef struct {
    int x;
    int y;
} StructA;

typedef struct {
    StructaA str;
    pthread_mutex_t* mutex;
} Parameters;

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
int n=3;

main(){

    pthread_t thread;
    StructA str[n];
    Parameters thParam[n];

    for (int i=0; i<n; i++){
        thParam[i].str = &str[i];
        thParam[i].mutex = &mutex;
    }

    for (int i=0; i<n; i++){
        if(pthread_create(&thread[i], NULL, &Thread1, (void*)&thParam))
        exit;
    }

    etc...
}

Thread1(params*){

    Parameters * param[n];
    StructA stra[n];

    for (int i=0; i<n; i++){
        ??????????????????
    }
}

Я думал о чем-то вроде этого :

for(int i=0; i<ghostN; i++){
    param[i] = ((Parameters*) params+i);
    stra[i] = param[i];
}

но я просто все больше и больше путаю код. Каков будет правильный способ сделать это?

Считайте, что я должен сделать это, чтобы увидеть каждое значение str [n] (структуру внутри main, которую я передал потоку) внутри самого потока.

1 Ответ

0 голосов
/ 10 февраля 2020

Память основного процесса распределяется между всеми. Таким образом, каждый поток имеет возможность доступа к одной и той же переменной или массивам. Единственное, что имеет смысл перейти к функции запуска потока - это somethign uniqu ie. Обратите внимание, что вы ничего не можете передать потоку, поток не является функцией, но вы можете передать что-то в функцию запуска потока, чтобы сохранить ее в стеке этой функции. Каждый вызов функции выделяет стек, уникальный для этой функции.

Итак, в вашем примере я бы сохранил массив thParam в глобальной области видимости, чтобы сделать его доступным для всех потоков, что-то вроде следующего

Parameters thParam[n];
StructA str[n];

void *startThread(void *arg) {
     long int i = (long int)arg;

     use(thParam[i]);
}

main(){

    pthread_t thread[n];

    for (long int i=0; i<n; i++){
        thParam[i].str = &str[i];
        thParam[i].mutex = &mutex;
    }

    for (int i=0; i<n; i++){
        if(pthread_create(&thread[i], NULL, &startThread, (void*)i))
        exit;
    }
    ...
}

Обратите внимание, что в приведенном выше случае все записи в thParam выполняются до запуска потока. Таким образом, нет необходимости обеспечивать синхронизацию здесь. Кроме того, поскольку все потоки имеют доступ только к своей собственной части массива, определенной i, синхронизация также не требуется.

Вам необходимо передать i по значению, чтобы избежать проблем с синхронизацией. Поэтому вам лучше использовать long int, чтобы его размер соответствовал размеру указателя void *.

И в ваших случаях thread также должен быть массивом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...