-1

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 = threadunlock メソッドは、thread == ownerおよび が設定されている場合にミューテックスのロックを解除しますowner = NULL

trylock メソッドは単純に をチェックしowner == NULL、mutex がどのスレッドによってもロックされていないことを示します。

およびメソッドはsetget呼び出し元のスレッドがロックされたミューテックスの所有者である場合にのみ、格納されたポインターを設定して返します。

メソッドを呼び出すたびにスレッド全体を渡すことで、少し行き過ぎている気がしますが、Allegro にはスレッドセーフがないため、このクラスをスレッドセーフにする他の方法はありません。関数またはそのal_get_current_thread()ようなもの。このクラスはどうすればいいですか?

4

1 に答える 1

1

Allegro ミューテックス機能のみをラップし、他には何もしないクラスを作成することを強くお勧めします。次に、ミューテックスを使用してデータへの排他的アクセスを提供する別のテンプレート クラスを作成します。

データの競合を避けるために、アクセスにMutex::ownerは同期が必要です。再帰的および/またはトライロック動作を本当に提供したい場合は、実装で基本的なミューテックスを使用する別のクラスまたはクラスでそれを行います。(ヒント: 1 つのミューテックスを使用してフィールドを保護しowner、別のミューテックスを使用してクライアントに実際の相互排除を提供します)。

引数のない基本的な RAII ラッパーだけで、ALLEGRO_THREAD本当に必要になると思います。

于 2013-06-20T19:50:20.993 に答える