1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

RustのMutexのようにlockしないとデータにアクセスできないクラスをC++で実装してみた

Posted at

#概要

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);


1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?