【问题标题】:Creating a mutex class using Allegro mutexes使用 Allegro 互斥体创建互斥体类
【发布时间】:2013-06-20 17:48:06
【问题描述】:

我正在尝试创建一个基于 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 方法将检查owner 是否为NULL(表示互斥锁已解锁且没有线程拥有它)。如果是NULL,那么它将设置owner = thread并锁定互斥锁。如果thread == owner 并设置owner = NULL,则unlock 方法解锁互斥锁。

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

setget 方法将设置并返回存储的指针,前提是调用线程是锁定互斥体的所有者。

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

【问题讨论】:

  • 你有非静态类成员的初始化器——你实际上是在使用 C++11。 ;)

标签: c++ mutex allegro


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-30
    • 2013-06-08
    • 1970-01-01
    • 2021-11-18
    相关资源
    最近更新 更多