Подтвердить что ты не робот

Загрузка нескольких копий общей библиотеки

Я запускаю Linux, и я хотел бы иметь возможность делать параллельные вызовы функций в общую библиотеку (.so), которая, к сожалению, не является потоковой (я предполагаю, что она имеет глобальные структуры данных).

По соображениям производительности я не хочу просто переносить вызовы функций в мьютекс.

Я хотел бы сделать это, чтобы создать, сказать 4 потока, а также загрузить 4 копии одной и той же библиотеки в память процесса. Каждый поток затем вызывает вызовы функций в свою собственную копию библиотеки.

К сожалению, dlopen не позволяет загружать больше одного экземпляра любой библиотеки.

Кто-нибудь знает какой-либо метод, который позволит мне загружать библиотеку более одного раза? (Помимо создания 4-х копий файла .so, каждое из которых имеет другое имя)

4b9b3361

Ответ 1

Вы можете загрузить несколько независимых копий библиотеки следующим образом:

#define _GNU_SOURCE
#include <dlfcn.h>
...
void *handle = dlmopen(LM_ID_NEWLM, "/path/to/library.so", RTLD_NOW);

Подробнее здесь.

Ответ 2

Вместо использования потоков вы можете использовать несколько процессов, каждый из которых выполняет некоторую работу. Это очень часто встречается в * nix и обычно проще кодировать.

Ответ 3

Похож на плохую идею. Это не возможно с общими библиотеками, как со статическими.

Вероятно, вы можете использовать dlopen() с флагом RTLD_LOCAL, чтобы последующие вызовы в dlopen не увидели, что он уже загружен и заставляет его работать так, как вы хотите... но он по-прежнему выглядит плохой дизайнерской идеей. Если у вас проблемы с производительностью, лучше избегать помех памяти с несколькими копиями одной и той же библиотеки.

Я бы предложил либо использовать несколько процессов, либо перейти к способу мьютекса, это, вероятно, более эффективно.

Когда вы работаете в Linux, также могут существовать другие подходы, если вы можете получить доступ к исходному коду библиотеки, например, переименовать ее символы, чтобы иметь как можно больше отдельных экземпляров... Ну, как только вы получите источник, может быть другие способы, например, сделать поток библиотеки безопасным.

Ответ 4

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