8

さかのぼる 2010 年、Herb Sutter はDr. Dobbに関する記事で、ネイキッド スレッドの代わりにアクティブ オブジェクトの使用を提唱しました。

C++11 バージョンは次のとおりです。

class Active {
public:
    typedef std::function<void()> Message;

    Active(const Active&) = delete;
    void operator=(const Active&) = delete;

    Active() : done(false) {
        thd = std::unique_ptr<std::thread>(new std::thread( [=]{ this->run(); } ) );
    }

    ~Active() {
        send( [&]{ done = true; } );
        thd->join();
    }

    void send(Message m) { mq.push_back(m); }

private:
    bool done;
    message_queue<Message> mq; // a thread-safe concurrent queue
    std::unique_ptr<std::thread> thd;

    void run() {
        while (!done) {
            Message msg = mq.pop_front();
            msg(); // execute message
        } // note: last message sets done to true
    }
};

クラスは次のように使用できます。

class Backgrounder {
public:
    void save(std::string filename) { a.send( [=] {
        // ...
    } ); }

    void print(Data& data) { a.send( [=, &data] {
        // ...
    } ); }

private:
    PrivateData somePrivateStateAcrossCalls;
    Active a;
};

void 以外の戻り値の型を持つメンバー関数をサポートしたいと考えています。しかし、これを実装するための優れた設計を思いつくことはできません。つまり、異種の型のオブジェクトを保持できるコンテナ ( などboost::any) を使用しなければなりません。

std::futureどんなアイデアでも大歓迎です。特に、や などの C++11 機能を利用する回答ですstd::promise

4

1 に答える 1