プロセス間共有用の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);