4

時間のかかるサービスを提供するライブラリを開発しています。各APIの2つのバージョンが必要です。1つは同期関数呼び出し用で、もう1つは非同期用です。

ライブラリユーザーは、使用するバージョンを決定する必要があります。サービスの結果は、システム操作(同期呼び出し)を継続するために重要な場合があります。続行する必要がないため、同じ操作を別のワーカースレッドで実行する必要がある場合があります(非同期呼び出し)。

このアプローチの問題は何ですか?

より良い方法はありますか?

同じ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;
        }
    }
};

編集:「MatthieuM。」として 述べたように、私のサービスでは、継続渡しスタイル(API終了後のコールバック)との非同期が必要です。

4

1 に答える 1

6

非同期バージョンの呼び出しが必要な場合は、同期操作のみを提供し、ユーザーに使用するようにアドバイスすることをお勧めします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
于 2012-12-30T18:15:52.177 に答える