プロセス間共有用のnamed mutex

interprocessには"named mutex"という名前付きMutex Objectを作成して複数のプロセス間で排他制御を行える機構があります。recursiveなMutexなどありますが、多分interprocessとして特徴的な機能だと思いますので紹介。作り方と最終的な削除方法が面倒ですが、ロック方法は同じです。以下のコードはinterprocessのドキュメントとほぼ同じ。

#include <boost/interprocess/sync/named_mutex.hpp>
#include <boost/interprocess/sync/scoped_lock.hpp>
#include <fstream>
#include <iostream>

int main()
{
    namespace bip = boost::interprocess;

    try {
        struct named_mutex_deleter
        {
            named_mutex_deleter()  { bip::named_mutex::remove("FileStreamMutex"); }
            ~named_mutex_deleter() { bip::named_mutex::remove("FileStreamMutex"); }
        } deleter;

        bip::named_mutex mutex(bip::open_or_create,"FileStreamMutex");

        std::ofstream ofs("file_name");

        for( std::size_t i = 0 ; i < 10 ; ++i )
        {
            // 1ループ中ではほかのプロセスはファイルにアクセスできない
            bip::scoped_lock<bip::named_mutex> lock(mutex);
            ofs << "Process Name, " << "This roop #" << i << std::endl;
        }

        // remove for named mutex "FileStreamMutex".
    } catch( bip::interprocess_exception const& e ) {
        std::cout << e.what() << std::endl;
    }
}

他のプロセス内で同様にこのnamed mutexを取得し、ロックした後ファイルへアクセスするようにすると、他のプロセスとの共有ができます。
ドキュメントによるとinterprocess内の全部のMutexはlock, try_lock, timed_lock, unlockメソッドを持っているようなので、scoped_lockなどのLockableなクラスは全てのMutexで使用可能なようです。ちなみに、scoped_lockの型指定が面倒な人はC++0xであればautoとmoveを使うと型指定が不要になり結構楽だと思います。まあ、あんまり短くならないので好みによる?

namespace krustf {

template<class MutexType>
boost::interprocess::scoped_lock<MutexType> scoped_lock(MutexType& m)
{
    return boost::interprocess::scoped_lock<MutexType>(m);
}

};

namespace bip = boost::interproces;
bip::named_mutex Mutex(bip::open_or_create,"Name");

auto lock = krustf::scoped_lock(Mutex);