#概要
c++でデータの排他制御をmutexで行う場合に忘れがちなmutexロックをrustのmutexっぽく使えるようにしてみました
mutexとデータを合わせて定義する事によりデータは隠蔽された状態となります。
mutexのlock時にスマートポインタを取得でき、このスマートポインタを介してデータアクセスできるようになります、
スマートポインタ解放時には自動でmutexはunlockされます
#ソース
#使い方
テンプレートMutexGuardの第一引数にデータの型、第二引数でmutexの型を指定します、省略時はstd::mutexが使われます。
auto_lock()でmutexをlockしてデータのスマートポインタを取得します。
*, -> 演算子でデータへアクセス
try_auto_lock()を使ってロックの取得を試みることも可能、またstd::timed_mutexやstd::recursive_timed_mutexを使えば try_auto_lock_for()やtry_auto_lock_until()でタイムアウト指定もできます。
#include <complex>
#include <cassert>
#include "MutexGuard.hpp"
MutexGuard<int> a {0};
MutexGuard<std::complex<float>, std::recursive_timed_mutex> c{{1.0f, 2.0f}};
{
auto p = a.auto_lock();
(*p)++;
}
assert(*a.auto_lock() == 1);
{
auto p = c.try_auto_lock_for(std::chrono::seconds(1));
if(p) {
p->real(4.0);
p->imag(1.0);
}
}
auto d = *c.auto_lock();
assert(d.real() == 4.0);
assert(d.imag() == 1.0);