Идентификационный номер Pthread увеличивается и заставляет цикл работать некорректно - PullRequest
0 голосов
/ 27 октября 2019

РЕДАКТИРОВАТЬ: я исправил проблему, избавившись от структуры и передав копию параметра цикла.

 //The struct that gets passed in to threadsafe function
 struct threading_struct {
    cell *cellMatrix;
    int thread_number;
 };

 //WHERE BELOW VOID IS CALLED FROM
 do {
    pthread_t threads[num_Threads];
    void *th_status;
    thread_part = 0;

    for(int i = 0; i < num_Threads; i++) {
        pthread_create(&threads[i], NULL, dissipate_cell, (void*) &threading_info);
    }



 void* name_of_function(void* args) {
     struct threading_struct *arg_struct = (struct threading_struct*) args;
     int ending = 0;
     threading_info.thread_number = thread_part++; //thread_part is a global variable

     if(offStride && arg_struct->thread_number == num_Threads - 1) {
         ending = (arg_struct->thread_number+1)*stride + info.numBoxes % num_Threads;
     } else {
         ending = (arg_struct->thread_number+1)*stride;
     }


     for(int i = arg_struct->thread_number*stride; i < ending; i++) {

ВЫХОД:

 "Thread number: 0  Tn 2: 0  i: 0
 "Thread number: 2  Tn 2: 2  i: 6
 "Thread number: 2  Tn 2: 2  i: 7
 "Thread number: 2  Tn 2: 2  i: 8
 "Thread number: 2  Tn 2: 2  i: 1
 "Thread number: 2  Tn 2: 2  i: 2
 "Thread number: 1  Tn 2: 1  i: 3
 "Thread number: 2  Tn 2: 2  i: 4
 "Thread number: 2  Tn 2: 2  i: 5

Как видите, потокномер 2 часто используется, а номера 1 и 0 используются только один раз. Я пытаюсь заставить каждый поток использоваться равное количество раз с индексом последних потоков, добавляя numboxes% numthreads, если numthreads не делится равномерно на numboxes. Есть ли что-то, что я делаю неправильно? Моя программа дает мне правильный ответ, но каждый поток не используется в полной мере. Проблема в том, что thread_part является глобальной переменной? Я думал, что, как только функция потока будет введена с thread_part = 0, 1 или 2, она останется этим числом до конца, даже если глобальная переменная изменилась. Может быть, мое мышление неверно в этом отношении?

Спасибо за вашу помощь.

...