Мне нужно использовать библиотеку, которая вызывает вызовы базы данных, которые не являются потокобезопасными. Также мне иногда приходится загружать большие объемы данных в фоновый поток.
Трудно сказать, какие функции библиотеки фактически получают доступ к БД, поэтому я считаю, что самый безопасный для меня подход - защитить каждый вызов библиотеки с помощью блокировки.
Скажем, у меня есть объект библиотеки:
dbLib::SomeObject someObject;
Сейчас я могу сделать что-то вроде этого:
dbLib::ErrorCode errorCode = 0;
std::list<dbLib::Item> items;
{
DbLock dbLock;
errorCode = someObject.someFunction(&items);
} // dbLock goes out of scope
Я хотел бы упростить это к чему-то вроде этого (или даже проще):
dbLib::ErrorCode errorCode =
protectedCall(someObject, &dbLib::SomeObject::someFunction(&items));
Основное преимущество этого заключается в том, что мне не придется дублировать интерфейс dbLib::SomeObject
, чтобы защитить каждый вызов с помощью блокировки.
Я уверен, что это общий шаблон/идиома, но я не знаю его имени или каких ключевых слов для поиска. (Глядя на http://www.vincehuston.org/dp/gof_intents.html Я думаю, это скорее идиома, чем шаблон).
Где я должен искать дополнительную информацию?