Я занимаюсь разработкой библиотеки, которая предоставляет некоторые трудоемкие услуги. Мне нужно иметь две версии каждого API, одну для синхронного вызова функции, а другую для асинхронного.
Пользователь библиотеки должен решить, какую версию использовать, результат службы может иметь решающее значение для продолжения работы системы (синхронный вызов). Одна и та же операция может потребоваться для выполнения в другом рабочем потоке, так как ее результат не требуется для продолжения (асинхронный вызов).
Каковы проблемы этого подхода?
Есть ли лучший способ?
Существуют ли популярные библиотеки, которые обеспечивают синхронизацию / асинхронность для одного и того же API (без использования внешних событий или потоков)?
Вот пример того, что я собираюсь предоставить:
enum StuffStatus
{
SUCCEED,
FAILED,
STILL_RUNNING
};
class IServiceCallback
{
public:
void lengthyStuffCallback(StuffStatus status);
};
class MyServiceClass
{
public:
StuffStatus doSomeLengthStuff(IServiceCallback* callback)
{
if( callback == NULL ) // user wants sync. call
{
// do all operations in caller context
return SUCCEED;
}else{
// save the callback, queue the request in a separate worker thread.
// and after the worker thread finishes the job it calls callback->lengthyStuffCallback(SUCCEED) from its context.
return STILL_RUNNING;
}
}
};
РЕДАКТИРОВАТЬ:
Как ‘Матье М.’ Как уже упоминалось, в моем сервисе мне нужен асинхронный стиль продолжения передачи (обратный вызов после завершения API).
Вы можете рассмотреть возможность предоставления только синхронная работа и советуем пользователям использовать std::future<...>
(или аналогичное средство, если вы не можете использовать C ++ 2011), если им нужна асинхронная версия вызова!
std::future<StuffStatus> async(std::async(&MyServiceClass::doSomeLengthyStuff,
&service));
// do other stuff
StuffStatus status = async.get(); // get the result, possibly using a blocking wait
Других решений пока нет …