Память основного процесса распределяется между всеми. Таким образом, каждый поток имеет возможность доступа к одной и той же переменной или массивам. Единственное, что имеет смысл перейти к функции запуска потока - это 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
также должен быть массивом.