C++ 使用Allegro互斥体创建互斥体类

C++ 使用Allegro互斥体创建互斥体类,c++,mutex,allegro,C++,Mutex,Allegro,我正在尝试基于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 ();

我正在尝试基于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

  }
模板
类互斥
{
私人:
快板互斥*互斥=空;
ALLEGRO_THREAD*owner=NULL;
T*data=NULL;
公众:
互斥体();
互斥(T*数据);
~Mutex();
布尔锁(快板螺纹*螺纹);
布尔解锁(快板线程*线程);
bool trylock();//如果可以锁定线程,则返回true
布尔集合(T*数据,快板线程*线程);
bool get(T**data,ALLEGRO_THREAD*THREAD);//传递指针的引用
}
构造函数将调用
al\u create\u mutex()
,在第二个构造函数中,设置数据指针。析构函数调用
al\u destroy\u mutex()

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

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

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


我有一种感觉,每次你想调用一个方法的时候,我都会有点过火,因为Allegro没有一个
al\u get\u current\u thread()
函数或类似的函数,所以我看不到任何其他方法使这个类线程安全。我应该如何处理这个类?

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

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


我怀疑,没有ALLEGRO_线程参数的基本RAII包装器是您最终真正需要的。

您有非静态类成员的初始值设定项-实际上您正在使用C++11;)