У меня действительно странная ситуация. Я делаю многопоточное приложение C на Linux, используя все мелкие детали памяти, включая строки char *, и я застрял в действительно странном положении.
По сути, при использовании потоков POSIX я читаю и записываю данные в двумерный массив символов, но в нем есть необычные ошибки. У меня есть слово, что я провел обширное тестирование того, к чему они имеют индивидуальный доступ, и они не читают данные других потоков, не говоря уже о том, чтобы писать другим. Когда последний поток, работающий с массивом, меняет свои части массива, он, похоже, меняет последние несколько символов своих массивов и помещает туда символы, которые я не знаю, как они могли туда попасть; в основном те, которые печатают как черные знаки вопроса с бриллиантами.
Я использую valgrind и GDB, и они действительно не помогают. Насколько я могу сказать, все должно работать. Вальгринд говорит мне, что я не освобождаю все.
Я знаю все, что звучит довольно неописуемо, но вот где это становится странным: если я компилирую свою программу с электрическим забором, то она все работает . Вальгринд говорит мне, что я освобождаю все и что в памяти вообще нет ошибок, как я и думал. Работает абсолютно без нареканий!
Итак, я предполагаю, что мой вопрос: почему моя программа работает нормально при компиляции с электрическим забором?
(А также дополнительный вопрос: какие шаги необходимо предпринять, чтобы обеспечить 100% -ный «потокобезопасный» код?)