2013-06-20 43 views
-1

我正在嘗試基於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是否表示互斥體未被任何線程鎖定。

setget方法將設置並返回存儲的指針,只有當調用線程是鎖定互斥量的所有者時。

我有一種感覺,我每次想要調用某個方法時都會傳遞整個線程,但我沒有看到任何其他方式使此類線程安全,因爲Allegro沒有al_get_current_thread()函數或類似的東西。我應該怎樣處理這個課程?

+1

你有非靜態類成員的初始化器 - 實際上你正在使用C++ 11。 ;) – Casey

回答

1

我強烈建議您創建一個只包裝Allegro互斥功能的類,並且別無其他。然後製作一個單獨的模板類,它使用互斥體提供對數據的獨佔訪問。

您訪問Mutex::owner需要同步以避免數據競爭。如果你真的想提供遞歸和/或trylock行爲,那麼在一個單獨的一個或多個在其實現中使用基本互斥鎖的類中執行此操作。 (提示:使用一個互斥體來保護owner字段,另一個互斥體爲客戶端提供實際互斥)。

我懷疑一個沒有ALLEGRO_THREAD參數的基本RAII包裝是你真正需要的。

+0

感謝您的見解:) – creXALBO