boost::thread

スレッド処理自体、そんなに書いたことがないのでさわり程度に。
boost の場合、環境によって内部で切り替えを行っているので、
環境に依存しないコードを書く事ができるので便利。
使い勝手もそんなに難しくなかったかな。

#include <iostream>
#include <fstream>
#include <string>

#include <boost/thread.hpp>

void
read_file(const std::string& name, std::vector<char>& buffer){
    
    std::ifstream    ifs(name, std::ios::binary);
    
    buffer.clear();
    buffer.resize( ifs.seekg(0, std::ios::end).tellg() );
    ifs.seekg(0, std::ios::beg).read(&buffer[0], buffer.size() );

}

int
main(){
    
    std::vector<char>    buffer1;
    std::vector<char>    buffer2;
    std::vector<char>    buffer3;

    // コンストラクタに関数を渡すとスレッド処理が開始するよ
    boost::thread    reader1(read_file, "spgct1.png", buffer1);
    boost::thread    reader2(read_file, "spgct2.png", buffer2);
    boost::thread    reader3(read_file, "spgct3.png", buffer3);
    
    // 読み込みが終わるまで待ってるよー
    reader1.join();
    reader2.join();
    reader3.join();

    std::cout << "全部終わったよー\n";

    return 0;
}

複数のスレッドを使用して、同時にファイル読み込んでいます。
boost::thread のコンストラクタに関数を渡すことによって、
その関数が、スレッドとして呼ばれます。
関数内で処理が終了すれば、同時にスレッドも終了します。
今回は、引数付きの関数を引数と一緒に渡していますが、
引数なしの関数や関数オブジェクトも問題なく渡すことが出来ます。
また、boost::thread::join() を呼ぶことで、
スレッドが終了するまでの待ち処理を行います。


boost::mutex 等の処理も行えますが、今回はとりあえずコレだけ。
最近だとゲームにもスレッド処理が入るようになってきたので
スレッドの勉強はしたいところ。


ところで、PS3だとスレッド周りの処理は、実機に依存すると思うから
boost::thread が使えなさそうだな・・・。
楽にラッピングできるライブラリも用意されてたりしないだろうか・・・。


[boost]
ver 1.44.0

[参照]
http://www.kmonos.net/alang/boost/classes/thread.html
http://www.yukun.info/blog/2008/07/boost-thread-create-run.html