Как динамически загружать объекты C ++ и использовать их через интерфейс оболочки - PullRequest
1 голос
/ 26 июля 2011

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

Я хотел бы заменить это некоторой существующей библиотекой потоков, но я также хотел бы обеспечить некоторую гибкость, что означает, что я хотел бы иметь возможность опробовать несколько библиотек, чтобы увидеть, как они работают на разных платформах, которые я создаю. библиотеки для (я хотел бы попробовать boost :: thread, Poco :: Thread и новую реализацию потока C ++ 0X) или даже позволить пользователю, которому я предоставляю свою библиотеку, приспособить его собственную реализацию потока, если это необходимо, так, чтобы библиотека и приложение пользователя смогут использовать одну и ту же инфраструктуру потоков - в идеале у меня должен быть файл конфигурации или что-то в этих строках, чтобы пользователь мог указать желаемую реализацию или использовать предоставленную по умолчанию.

Я думал о следующем:

  • создание тонкой оболочки (стиль pimpl) для использования внутри моей библиотеки, которая будет использовать загрузчик динамических классов, чтобы соответствовать желаемой реализации во время выполнения. Но как я могу справиться со случаем потоков C ++ 0X? Они находятся в стандартной библиотеке, которая уже будет связана с моей библиотекой, поэтому нет смысла загружать ее во время выполнения.
  • с использованием динамического загрузчика в сочетании с шаблоном проектирования Prototype. Но шаблон требует реализации метода clone () , что означало бы изменение кода библиотеки потоков. Возможно, я плохо понял схему и могу ошибаться, поэтому поправьте меня, если я ошибаюсь.

Как вы видите, у меня не так много идей для работы прямо сейчас (но это только начало), поэтому любые указатели на следующее будут очень полезны:

  • Является ли предоставление такой функциональности хорошей идеей? Вы видите какие-нибудь предостережения?
  • Является ли средство динамической загрузки осуществимой идеей? Каковы недостатки? Любые указатели / ссылки о том, как правильно реализовать это?
  • Если я собираюсь пойти по пути "тонкой оболочки", было бы неплохо представить его как часть API моей библиотеки?
  • Существуют ли альтернативы / шаблоны для достижения того же вида функциональности (я имею в виду достижение того же результата, но без динамической загрузки)?

Ответы [ 2 ]

2 голосов
/ 26 июля 2011

В чем преимущество предоставления возможности динамически или задерживать загрузку потокового решения? В идеале вы должны выбрать потоковое решение и создать библиотеку, которая имеет интерфейс API, и если позднее решение окажется недостаточным, вы можете написать новую библиотеку, используя тот же интерфейс, но другое базовое решение. Я бы даже подумал о статической компоновке такой библиотеки, хотя DLL тоже подойдет. Я не стал бы беспокоиться о возможности сделать его взаимозаменяемым во время выполнения или что-то подобное.

Я настоятельно рекомендую повысить темы. Кроссплатформенный и основанный на POSIX, его очень легко реализовать различными способами. Я полагаю, что потоки C ++ 0x были незначительно основаны на этом решении, однако, поскольку C ++ 0x не завершен или не полностью поддерживается всеми компиляторами, я бы рассматривал его только как замену для повышения в будущем.

1 голос
/ 26 июля 2011

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

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

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