Как сделать поток-локальный экземпляр библиотеки? - PullRequest
0 голосов
/ 07 ноября 2019

Мы используем устаревшую библиотеку на нашем рабочем месте. Он содержит некоторую бизнес-логику, и его код был утерян до смены тысячелетий. Код содержит несколько жестких финансовых алгоритмов, он активно использует глобальные переменные.

Мы планируем провести некоторые вычисления параллельно, запуская новые потоки. Каждый поток будет независим от другого, просто черный ящик, возвращающий некоторое число.

Основная проблема в том, что библиотека не является поточно-ориентированной. Мы бы хотели, чтобы каждый поток имел свою собственную копию глобальных переменных, кода и т. Д. Из общей библиотеки.

Возможно ли это? В настоящее время мы просто исправляем имена символов и делаем копии с префиксами.

library-thread1.so, library-thread2.so и т. Д.

Символы загружаются с использованием RTLD_DEEPBIND под linux.

РЕДАКТИРОВАТЬ: Замена потоков процессами является наиболее прямым способом решения этой проблемы, но это вызывает обеспокоенность по поводу производительности. И, кажется, много работы, чем просто грязный хак.

1 Ответ

1 голос
/ 07 ноября 2019

Основная проблема в том, что библиотека не является поточно-ориентированной.

Используйте процессы, а не потоки. Библиотека будет автоматически защищена от нескольких процессов без каких-либо усилий или риска случайного совместного использования.

Мы бы хотели как-то сделать, чтобы у каждого потока была своя собственная копия глобальных переменных, кода и т. Д. из общей библиотеки.

Потоки с этим свойством называются процессами. Процессы - в основном - потоки, которые не разделяют глобальные переменные (включая такие вещи, как дескрипторы файлов, std::cout буферы и т. Д.).

Процессы, как правило, в Linux или * NIX значительно дороже,или медленнее в общении, чем с потоками.

Замена потоков процессами - это самый простой способ решить эту проблему, но возникают проблемы с производительностью

Так что сделайте это и потом мера производительность. Если это действительно проблема, вы можете использовать разделяемую память в Linux, чтобы поддерживать эффективную связь потоков с нулевыми накладными расходами, сохраняя при этом правильную семантику.

И, похоже, это большая работа, чем просто выполнениегрязный хак.

Беспокоитесь больше о том, сколько потребуется поддержки грязного хака, когда все пойдет не так, и вы не можете понять, почему.

...