Если вы передадите адрес переменной, которая меняется, вы должны ожидать, что она может измениться на вас: -)
Вероятно, вы устанавливаете doRowOffset
на 1 (например) и затем запускаете поток. До того, как этот поток запускает и разыменовывает свой указатель, вы меняете doRowOffset
для следующего потока.
Затем, когда первый поток окончательно разыменует адрес, вы изменили базовое значение.
Есть два способа справиться с этим. Первый - это синхронизировать основной и дочерний потоки так, чтобы основной ожидал, пока дочерний процесс не разыменует переменную и не сохранит значение локально. Только тогда основной поток изменяет переменную для следующего потока, который он собирается запустить. Тем не менее, этот вид побеждает назначение потоков: -)
Другой способ - привести действительное целочисленное значение (не адрес) к пустому указателю, который передается в функцию потока. Это будет означать, что значение будет скопировано в стек функции потока, а не в адрес, и основной поток не сможет повлиять на него.
Что-то вроде:
pthread_create (&threadHandler[threads], NULL, multiplyRows,
(void *) doRowOffset); // <<-- Note, removed the '&'.
в основном потоке и:
int offset = (int) dealWithRows;
в дочерней ветке.