-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()并在第二个的情况下设置数据指针。析构函数调用al_destroy_mutex().

lock 方法将检查是否ownerNULL(表示互斥锁已解锁并且没有线程拥有它)。如果是NULL,那么它将设置owner = thread并锁定互斥锁。unlock 方法解锁互斥锁 ifthread == owner和设置owner = NULL

trylock 方法只是检查 if owner == NULL,表明互斥锁没有被任何线程锁定。

set和方法将get设置并返回存储的指针,仅当调用线程是锁定互斥锁的所有者时。

我有一种感觉,每次你想调用一个方法时,整个线程都通过了,但我看不到任何其他方法可以使这个类线程安全,因为 Allegro 没有一个al_get_current_thread()函数或类似的东西。这门课我该怎么办?

4

1 回答 1

1

我强烈建议您创建一个只包装 Allegro 互斥锁功能的类,不做任何其他事情。然后制作一个单独的模板类,它使用互斥锁来提供对数据的独占访问。

您的访问Mutex::owner需要同步以避免数据竞争。如果您真的想提供递归和/或 trylock 行为,请在一个或多个单独的类中执行此操作,这些类在其实现中使用您的基本互斥锁。(提示:使用一个互斥锁来保护该owner字段,另一个为客户端提供实际的互斥)。

我怀疑没有ALLEGRO_THREAD参数的基本 RAII 包装器就是您最终真正需要的。

于 2013-06-20T19:50:20.993 回答