Я создаю несколько потоков параллельно, выполняя следующую функцию потока, входным параметром для функций потока является целое число.
разные потоки получают разные целые числа. В функции потока я определяю локальную переменную thread_index, чтобы принимать это целое число, которое будет использоваться в вычислениях. Моя проблема в том, что эти локальные переменные будут перепутаны с переменными из других потоков, что, я думаю, не должно происходить. Фактически, в каждой функции потока есть цикл, и первая попытка цикла в порядке для всех потоков, но после этого локальная переменная thread_index испортилась. Я использовал семафорный барьер для защиты процесса расчета, но это не должно быть моей текущей проблемой.
Все не объявленные переменные предварительно определены в основной функции. Я не мог понять, почему локальные переменные были прерваны другими.
Ниже приведен процесс создания потока, где N - это целое число для управления количеством потоков, pthread_t t [N / 2].
for (long thread_index = 0; thread_index
void *exchange_swap(void *ptharg){
// cout<<"num_phases "<<num_phases<<endl;
long thread_index = (long) ptharg;
for (phase = 1; phase <= num_phases;)
{
int num_groups = pow(2, (phase-1) % num_stages);
// cout<<num_groups<<endl;
int group_size = N / num_groups;
int gindex = (thread_index) / (group_size / 2);
int mindex = (thread_index) % (group_size / 2);
int group_start = gindex * group_size;
int group_end = (gindex + 1) * group_size - 1;
int data1 = group_start + mindex;
int data2 = group_end - mindex;
// swap
int temp;
if (sortArray[data1]>sortArray[data2])
{
temp = sortArray[data1];
sortArray[data1] = sortArray[data2];
sortArray[data2] = temp;
}
sem_wait(&s);
cout<<"Thread "<<thread_index+1<<" finished stage "<<(phase - 1) / num_stages + 1<<" phase "<<(phase-1) % num_stages + 1<<endl;
finished_job++;
if (finished_job == N/2){
finished_job = 0;
phase++;
for (int i = 0; i < N; ++i)
{
cout<<sortArray[i]<<" ";
}
cout<<endl;
sem_post(&barrier);
}
sem_post(&s);
sem_wait(&barrier);
sem_post(&barrier);
}
return NULL;
}