РЕДАКТИРОВАТЬ: я исправил проблему, избавившись от структуры и передав копию параметра цикла.
//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, она останется этим числом до конца, даже если глобальная переменная изменилась. Может быть, мое мышление неверно в этом отношении?
Спасибо за вашу помощь.