我正在嘗試基於Allegro互斥體(跨平臺)創建自定義互斥體類。我是而不是使用C++ 11。我試圖像這樣做,但它似乎是有點畫蛇添足:使用Allegro互斥體創建互斥體類
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()
。
鎖定方法將檢查owner
是否爲NULL
(表示互斥鎖已解鎖且沒有線程擁有它)。如果它是NULL
,那麼它將設置owner = thread
並鎖定互斥鎖。如果thread == owner
和設置爲owner = NULL
,則解鎖方法將解鎖互斥鎖。
trylock方法只是檢查owner == NULL
是否表示互斥體未被任何線程鎖定。
set
和get
方法將設置並返回存儲的指針,只有當調用線程是鎖定互斥量的所有者時。
我有一種感覺,我每次想要調用某個方法時都會傳遞整個線程,但我沒有看到任何其他方式使此類線程安全,因爲Allegro沒有al_get_current_thread()
函數或類似的東西。我應該怎樣處理這個課程?
你有非靜態類成員的初始化器 - 實際上你正在使用C++ 11。 ;) – Casey