У меня есть многопоточная динамическая библиотека, которая предоставляет базовый API и которую я использую в
пара приложений. В настоящее время я использую пользовательскую (как в прежней версии) реализацию некоторых базовых примитивов потоков и синхронизации, которой я совсем не доволен, поскольку она не обеспечивает большой гибкости, функций, а также сопряжена с трудностями (имеет реализации для обоих Linux и Windows).
Я хотел бы заменить это некоторой существующей библиотекой потоков, но я также хотел бы обеспечить некоторую гибкость, что означает, что я хотел бы иметь возможность опробовать несколько библиотек, чтобы увидеть, как они работают на разных платформах, которые я создаю. библиотеки для (я хотел бы попробовать boost :: thread, Poco :: Thread и новую реализацию потока C ++ 0X) или даже позволить пользователю, которому я предоставляю свою библиотеку, приспособить его собственную реализацию потока, если это необходимо, так, чтобы библиотека и приложение пользователя смогут использовать одну и ту же инфраструктуру потоков - в идеале у меня должен быть файл конфигурации или что-то в этих строках, чтобы пользователь мог указать желаемую реализацию или использовать предоставленную по умолчанию.
Я думал о следующем:
- создание тонкой оболочки (стиль pimpl) для использования внутри моей библиотеки, которая будет использовать загрузчик динамических классов, чтобы соответствовать желаемой реализации во время выполнения. Но как я могу справиться со случаем потоков C ++ 0X? Они находятся в стандартной библиотеке, которая уже будет связана с моей библиотекой, поэтому нет смысла загружать ее во время выполнения.
- с использованием динамического загрузчика в сочетании с шаблоном проектирования Prototype. Но шаблон требует реализации метода clone () , что означало бы изменение кода библиотеки потоков. Возможно, я плохо понял схему и могу ошибаться, поэтому поправьте меня, если я ошибаюсь.
Как вы видите, у меня не так много идей для работы прямо сейчас (но это только начало), поэтому любые указатели на следующее будут очень полезны:
- Является ли предоставление такой функциональности хорошей идеей? Вы видите какие-нибудь предостережения?
- Является ли средство динамической загрузки осуществимой идеей? Каковы недостатки?
Любые указатели / ссылки о том, как правильно реализовать это?
- Если я собираюсь пойти по пути "тонкой оболочки", было бы неплохо представить его как часть API моей библиотеки?
- Существуют ли альтернативы / шаблоны для достижения того же вида функциональности (я имею в виду достижение того же результата, но без динамической загрузки)?