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() がずっと待機しているらしい。
理想的な処理の流れは、

  1. Thread を作成
  2. 非同期処理を post
  3. post した処理が終わるまで待機
  4. 同期処理を実行
  5. 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