Загрузить несколько копий общей библиотеки - PullRequest
12 голосов
/ 17 ноября 2009

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

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

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

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

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

Ответы [ 4 ]

9 голосов
/ 17 ноября 2009

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

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

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

6 голосов
/ 17 ноября 2009

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

1 голос
/ 17 ноября 2009

Похоже, плохая идея. С общими библиотеками это больше невозможно, как со статическими.

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

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

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

0 голосов
/ 17 ноября 2009

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

...