2016-03-03 67 views
1

我需要使用揮發性多重映射迭代,但是迭代器的運營商(如++),當它被定義爲揮發性不工作...如何使用volatile多圖迭代器?

首先:爲什麼需要揮發性迭代器(和不是一個可變的)?

我寫了一個實用程序類(Echeancier),它必須安排按日期排序的截止日期列表(Echeance)。 所有截止日期都存儲在一個multimap中,其關鍵是截止日期(_echeancesParDate)。

每個截止日期是連續管理的,只有一個linux定時器: - 當定時器到期時,它會產生一個信號; - 信號的處理程序處理與截止日期相關的事件,然後在下一個最後期限重新啓動計時器。

所以我需要在信號處理程序中使用typeListeEcheancesParDate :: iterator _comingEcheance。

另一方面,類Echeancier還定義了一個函數來創建新的截止日期(ajouterEcheance())。 此函數可能會更新_comingEcheance。

這就是爲什麼我需要將_comingEcheance定義爲volatile。

注:目前,我把原子訪問方面放在一邊。

我的源代碼(部分):

class Echeancier 
    { 

     private: 
     typedef std::multimap<Echeance::typeDateEcheance, Echeance*> typeListeEcheancesParDate; 

     typeListeEcheancesParDate _echeancesParDate; 

     typeListeEcheancesParDate::iterator volatile _comingEcheance; 

     void handlerEcheance(Echeance::typeEvenementEcheance eventEcheance); 

     AsyncTimer<Echeancier>* _timer; 
     int _numSignalTimer; 

     protected: 
     Echeancier(int signalEcheance); 
     ~Echeancier(); 

     virtual void traiterEvenement(Echeance::typeEvenementEcheance eventEcheance) = 0; 

     int ajouterEcheance(Echeance::typeDateEcheance date, 
        Echeance::typeEvenementEcheance evenement, 
        Echeance::typeIdentifiantEcheance & idEcheance); 
     int supprimerEcheance(Echeance::typeIdentifiantEcheance idEcheance); 
    } 

我唯一的想法是過載多重映射迭代++運算符,使其可與揮發性改性劑...... 但我不知道如何做到這一點...任何想法我的問題? 謝謝

+5

對我來說,除了硬件寄存器以外的其他東西都是「難聞的」......爲什麼代碼首先使用volatile?當然,如果其他線程可以操作它們,則需要適當的鎖定以防止另一個線程通過修改列表來擾亂當前線程工作......並且通過適當的鎖定,不需要volatile。 –

+0

謝謝你的回答。 – petitponey

+0

謝謝你的回答。但是我不會在多線程上下文中使用此代碼;我需要一個易變的變量,因爲這個迭代器在信號處理函數中被修改;這個處理函數可以在程序中的任意位置異步調用,這是不可預知的:它是主程序外部的代理(就像硬件中斷一樣)。 – petitponey

回答

1

所以,我發表評論說,volatile是多線程環境中的一種難聞的氣味,我堅持這一點。

在信號處理程序中處理數據也是一種難聞的氣味。使用鎖也不適用於信號處理程序,因爲沒有其他線程可以解鎖程序主線程所持有的鎖。

我認爲你需要重新考慮你的整個設計,並使用兩個線程[其中一個線程可以由定時器信號處理程序控制,並且具有高優先級]。重點在於操縱迭代器和迭代器指向的數據必須以原子方式處理,並且只標記volatile並不能解決這個問題 - volatile只意味着編譯器必須「完成代碼所要做的事情「 - 但這並不意味着你的數據本身是安全的。