Синхронный и Асинхронный API

Я занимаюсь разработкой библиотеки, которая предоставляет некоторые трудоемкие услуги. Мне нужно иметь две версии каждого 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).

4

Решение

Вы можете рассмотреть возможность предоставления только синхронная работа и советуем пользователям использовать 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
5

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]