4

別のスレッドでのログ記録に関する以前の質問への回答を受け取った後、現在、次のコードが表示されています (注: ここでの concurrent_queue は ppl からのものですが、その他の concurrent_queue は機能するはずです)。

class concurrentFuncQueue
    {
    private:
        typedef std::function<void()> LambdaFunction;
        mutable concurrency::concurrent_queue<LambdaFunction> functionQueue;
        mutable std::atomic<bool> endcond;
        LambdaFunction function;
        std::thread thd;
    public:
        concurrentFuncQueue() : endcond(false), thd([=]{
            while (endcond != true)
            {
                if (functionQueue.try_pop( function ))
                {
                    function(); //note: I am popping a function and adding () to execute it
                }
            }
        }){}
        ~concurrentFuncQueue() { functionQueue.push([=]{ endcond = true; }); thd.join(); }
        void pushFunction(LambdaFunction function) const { functionQueue.push(function); }
    };

基本的に、プッシュする関数は、メイン スレッドでのパフォーマンスの問題を回避するために、別のスレッド (ログ関数など) で順次実行されます。

現在の使用状況は次のとおりです。

static concurrentFuncQueue Logger;
vector<char> outstring(256);
Logger.pushFunction([=]{ OutputDebugString(debugString.c_str()) });

これまでのところ素晴らしい。関数を別のスレッドで順次実行する同時キューに関数をプッシュできます。

私も持っている必要があることの1つですが、現在は戻り値がないため、ex(疑似コード):

int x = y = 3;
auto intReturn = Logger.pushFunction([=]()->int { return x * y; });

x * y を並行キューにプッシュし、(他のスレッドで) 関数をポップして完了した後、計算された値を呼び出し元スレッドに返します。

(プッシュされた関数が返されるまで、呼び出し元のスレッドをブロックすることを理解しています。それがまさに私が望んでいることです)

std::promise のラインに沿って何かを使用する必要があるかもしれないと感じていますが、悲しいことに、それらについての私の現在の理解が低いため、コード化可能なものを策定することができません。

何か案は?上記の C++ コードに関する考えやその他のコメントも大歓迎です (別の実装がより適切である、または問題を解決すると思われる場合は、コードを完全に無視してください)。

4

1 に答える 1

3

次の行に沿って何かを使用できるはずです。

template<typename Foo>
std::future<typename std::result_of<Foo()>::type> pushFunction(Foo&& f) {
    using result_type = typename std::result_of<Foo()>::type; // change to typedef if using is not supported
    std::packaged_task<result_type()> t(f);
    auto ret_fut = t.get_future();
    functionQueue.push(std::move(t));
    return ret_fut;
}

LambdaFunctionこれを機能させるには、タイプ消去された関数ハンドラーを作成する必要があります。

于 2013-01-29T13:04:50.907 に答える