Мультитредное
Nov. 20th, 2015 07:52 pmНесколько дней коллега бился над проблемой, почему вдруг программа при завершении вдруг стала падать с ошибкой в malloc/free. Оказывается, кто-то в другом штате на другом берегу стал линковать одну из используемых динамических библиотек с -lpthread, а программа, которая этой библиотекой пользовалась, об этом деле ни сном ни духом.
Результат: адрес объекта std::locale, про который библиотека думала, что он thread-local и требует освобождения, динамический загрузчик честно-благородно брал из сегмента данных основной программы.
Перелинковали основную программу с -lpthread — всё починилось.
no subject
Date: 2015-11-21 04:26 am (UTC)Если верить этому популярному объяснению то опция -pthread одновременно влияющая на компиляцию и линковку, очень коварная, по меньшей мере.
no subject
Date: 2015-11-21 02:59 pm (UTC)А в принципе — в Стандарте сказано, что тот объект thread local? Или вообще thread safe? Если нет, то это бардак, что библиотека себе такое позволяет.
no subject
Date: 2015-11-21 04:23 pm (UTC)no subject
Date: 2015-11-21 04:33 pm (UTC)no subject
Date: 2015-11-21 05:03 pm (UTC)Это в линуксе clusterfuck, что при подгрузке .so, слинкованной с -lpthread, в процесс, слинкованный без -lpthread, всё тут же не вылетает с ошибкой.
no subject
Date: 2015-11-21 04:50 pm (UTC)no subject
Date: 2015-11-21 05:07 pm (UTC)Описанный случай - противоположный.
no subject
Date: 2015-11-21 05:09 pm (UTC)no subject
Date: 2015-11-21 07:21 pm (UTC)no subject
Date: 2015-11-22 12:40 am (UTC)Как раз наоборот, если бы потоки и динамически загружаемые библиотеки существовали "с самого начала существования С", то дизайн языка можно было бы назвать, мягко говоря, не очень продуманным.
no subject
Date: 2015-11-22 12:55 am (UTC)