Напишите новый исходный файл с функцией main
, которая выполняет те же действия, что и main
, который вы разместили здесь, за исключением того, что вместо pthread_create
просто вызываете функцию.Посмотрите, сможете ли вы воссоздать проблему независимо от использования потоков.Судя по тому, как все выглядит, ваши семафоры все равно должны нормально работать в однопоточной среде.
Если это все равно не получится, вам будет проще отладить его.* вместо возврата не выдает ошибку, это предполагает, что вы испортили либо адрес возврата, который находится в стеке при запуске runner
.Вызывая exit
, вы не полагаетесь на эту область памяти, чтобы получить доступ к функции выхода (если бы вы вернули, pthread_exit был бы вызван кодом библиотеки pthread, который вызвал runner
).Я думаю, что вывод valgrind не является точным на 100% - не из-за какой-либо ошибки в valgrind, а потому, что место, где вы вызываете ошибку в сочетании с типом ошибки, которую вы вызываете, очень затрудняет, чтобы быть уверенным, кто вызвал.
Некоторые gcc
флаги, которые могут вас заинтересовать:
-fstack-protector-all -Wstack-protector
Опция предупреждения не работает без опции -f.
Вы также можетехочу попробовать:
-fno-omit-frame-pointer