и затем я if(!pthread_join)
тот, который выполняет вычисления, и когда вычисления заканчиваются, я отменяю тот, который отображает точки.
В вашей программе есть логическая ошибка и ошибка, связанная с повреждением памяти.
Логическая ошибка: вы предполагаете, что !pthread_join
означает, что вычисления завершены. Это не означает . pthread_join
возвращает ненулевой статус только , если вы вызвали его с неверными параметрами (идентификатор потока w2
неизвестен, не был запущен или уже был присоединен).
Вместо этого ваш код должен выглядеть примерно так:
int rc = pthread_join(w2, ...);
assert(rc == 0);
rc = pthread_cancel(w1);
assert (rc == 0);
Об ошибке повреждения памяти: в 64-разрядной системе (что, как я полагаю, вы используете), sizeof(int) == sizeof(result) == 4
, но sizeof(void*) == 8
.
Этот код:
int result =0;
...
pthread_join(w1, (void**)&result)
берет 4-байтовый адрес result
и просит pthread_join
сохранить там 8-байтовое значение. Предсказуемый результат - повреждение стека.
Я не понимаю, как именно это вызывает SIGSEGV
, но если в вашей программе есть неопределенное поведение, все ставки отменяются.
Чтобы исправить это, измените тип result
на intptr_t
. Я ожидаю, что авария исчезнет после исправления.
Вам также следует попробовать использовать Address Sanitizer: gcc -fsanitize=address -g ...
перед внесением каких-либо изменений. Существует большая вероятность, что он расскажет вам о переполнении стека.