Allegro ミューテックス (クロスプラットフォーム) に基づいてカスタム ミューテックス クラスを作成しようとしています。私はC++11 を使用していません。私はこのようにしようとしていますが、少し余分なようです:
template <class T>
class Mutex
{
private:
ALLEGRO_MUTEX *mutex = NULL;
ALLEGRO_THREAD *owner = NULL;
T *data = NULL;
public:
Mutex ();
Mutex (T* data);
~Mutex ();
bool lock (ALLEGRO_THREAD* thread);
bool unlock (ALLEGRO_THREAD* thread);
bool trylock (); //Returns true if you can lock the thread
bool set (T* data, ALLEGRO_THREAD* thread);
bool get (T** data, ALLEGRO_THREAD* thread); //Pass reference of pointer
}
コンストラクターが呼び出さal_create_mutex()
れ、2 番目のコンストラクターの場合は、データ ポインターが設定されます。デストラクタは を呼び出しますal_destroy_mutex()
。
lock メソッドは、(mutex がロック解除されていて、それを所有しているスレッドがないことを示す)owner
かどうかを確認します。NULL
である場合、ミューテックスNULL
を設定してロックします。owner = thread
unlock メソッドは、thread == owner
および が設定されている場合にミューテックスのロックを解除しますowner = NULL
。
trylock メソッドは単純に をチェックしowner == NULL
、mutex がどのスレッドによってもロックされていないことを示します。
およびメソッドはset
、get
呼び出し元のスレッドがロックされたミューテックスの所有者である場合にのみ、格納されたポインターを設定して返します。
メソッドを呼び出すたびにスレッド全体を渡すことで、少し行き過ぎている気がしますが、Allegro にはスレッドセーフがないため、このクラスをスレッドセーフにする他の方法はありません。関数またはそのal_get_current_thread()
ようなもの。このクラスはどうすればいいですか?