【发布时间】: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,表示互斥锁没有被任何线程锁定。
set 和 get 方法将设置并返回存储的指针,前提是调用线程是锁定互斥体的所有者。
我有一种感觉,每次你想调用一个方法时,整个线程都通过了,但我看不到任何其他方法可以使这个类成为线程安全的,因为 Allegro 没有没有al_get_current_thread() 函数或类似的东西。这门课我该怎么办?
【问题讨论】:
-
你有非静态类成员的初始化器——你实际上是在使用 C++11。 ;)