さかのぼる 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
。