Ответ 1
Вы можете загрузить несколько независимых копий библиотеки следующим образом:
#define _GNU_SOURCE
#include <dlfcn.h>
...
void *handle = dlmopen(LM_ID_NEWLM, "/path/to/library.so", RTLD_NOW);
Подробнее здесь.
Я запускаю Linux, и я хотел бы иметь возможность делать параллельные вызовы функций в общую библиотеку (.so), которая, к сожалению, не является потоковой (я предполагаю, что она имеет глобальные структуры данных).
По соображениям производительности я не хочу просто переносить вызовы функций в мьютекс.
Я хотел бы сделать это, чтобы создать, сказать 4 потока, а также загрузить 4 копии одной и той же библиотеки в память процесса. Каждый поток затем вызывает вызовы функций в свою собственную копию библиотеки.
К сожалению, dlopen не позволяет загружать больше одного экземпляра любой библиотеки.
Кто-нибудь знает какой-либо метод, который позволит мне загружать библиотеку более одного раза? (Помимо создания 4-х копий файла .so, каждое из которых имеет другое имя)
Вы можете загрузить несколько независимых копий библиотеки следующим образом:
#define _GNU_SOURCE
#include <dlfcn.h>
...
void *handle = dlmopen(LM_ID_NEWLM, "/path/to/library.so", RTLD_NOW);
Подробнее здесь.
Вместо использования потоков вы можете использовать несколько процессов, каждый из которых выполняет некоторую работу. Это очень часто встречается в * nix и обычно проще кодировать.
Похож на плохую идею. Это не возможно с общими библиотеками, как со статическими.
Вероятно, вы можете использовать dlopen() с флагом RTLD_LOCAL, чтобы последующие вызовы в dlopen не увидели, что он уже загружен и заставляет его работать так, как вы хотите... но он по-прежнему выглядит плохой дизайнерской идеей. Если у вас проблемы с производительностью, лучше избегать помех памяти с несколькими копиями одной и той же библиотеки.
Я бы предложил либо использовать несколько процессов, либо перейти к способу мьютекса, это, вероятно, более эффективно.
Когда вы работаете в Linux, также могут существовать другие подходы, если вы можете получить доступ к исходному коду библиотеки, например, переименовать ее символы, чтобы иметь как можно больше отдельных экземпляров... Ну, как только вы получите источник, может быть другие способы, например, сделать поток библиотеки безопасным.
Что это за библиотека? Это что-то большое? Мне интересно, если вы не можете исправить библиотеку, чтобы быть потокобезопасным в некотором роде, а затем создайте свой код, используя поточную версию библиотеки. Это зависит от размера библиотеки и того, что с ней связано, но если вы можете исправить библиотеку, вы сможете создавать свое приложение так, как хотите, а также помогать всем остальным.