Почему локальная переменная в моей функции потока прерывается другими потоками? - PullRequest
0 голосов
/ 07 марта 2019

Я создаю несколько потоков параллельно, выполняя следующую функцию потока, входным параметром для функций потока является целое число. разные потоки получают разные целые числа. В функции потока я определяю локальную переменную 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;
}

1 Ответ

0 голосов
/ 07 марта 2019

Используя std::thread было бы проще и более "естественно" передавать значения:

std::vector<std::thread> threads(N / 2);  // Create a vector of N/2 threads

// For each thread in the vector
for (unsigned thread_index = 0; thread_index < threads.size(); ++thread_index)
{
    // Create the thread
    threads[thread_index] = std::thread(exchange_swap, thread_index);
}

// Possibly do other work...

// Again for each thread (thread index no longer needed)
for (auto& thread : threads)
{
    // Wait for it to end
    thread.join();
}

Тогда функция потока - это простая функция, принимающая индекс по значению и нене возвращает значение:

void exchange_swap(unsigned thread_index){
    ...
}

И, как я уже сказал в комментарии, передача значения, как вы делаете (путем приведения), в этом случае вполне допустима.

...