Boost.Asio で非同期処理
非同期で、1〜20 までの合計を計算します。
#include <iostream> #include <boost/asio.hpp> #include <boost/bind.hpp> #include <boost/thread.hpp> boost::mutex mutex; int sum = 0; void add(int n){ boost::mutex::scoped_lock lock(mutex); sum += n; std::cout << n << ":" << sum << std::endl; }; int main(){ namespace asio = boost::asio; asio::io_service io; // 非同期処理を登録 for(int i = 1 ; i < 21 ; ++i){ io.post(boost::bind(add, i)); }; // 複数のスレッドで処理 boost::thread_group group; for(int i = 0 ; i < 5 ; ++i){ group.create_thread(boost::bind(&asio::io_service::run, &io)); } // 全てのスレッドが終了するまで待機 group.join_all(); std::cout << "sum:" << sum << std::endl; return 0; }
[出力]
1:1 4:5 5:10 6:16 7:23 8:31 9:40 10:50 11:61 2:63 3:66 14:80 13:93 12:105 15:120 18:138 17:155 16:171 19:190 20:210 sum:210
うーん、こんな感じ?
本当は、WorkerThread パターン的な感じにやりたかったんですが、io_service::work を設定した際の同期の取り方が分からなかったので、io.post 後に Thread を作成しています。
io_service::work を設定すると work が破棄されるまで、io.run() がずっと待機しているらしい。
理想的な処理の流れは、
- Thread を作成
- 非同期処理を post
- post した処理が終わるまで待機
- 同期処理を実行
- 2に戻る
って、感じがやりたい。
しかし、Boost.Asio を使用すると非同期処理がだいぶ楽ですねぇー。
[boost]
ver 1.46.1
[参照]
http://d.hatena.ne.jp/izariuo440/20090523/1243084212
http://ja.doukaku.org/comment/9057/
http://d.hatena.ne.jp/faith_and_brave/20110408