如何使用volatile multimap迭代器?

时间:2016-03-03 17:03:15

标签: c++

我需要使用volatile multimap迭代器,但迭代器的运算符(例如++)在定义为volatile时不起作用...

首先:为什么我需要一个易变的迭代器(而不是一个可变的迭代器)?

我写了一个实用工具类(Echeancier),它必须安排一个按日期排序的截止日期(Echeance)列表。 所有截止日期都存储在一个多图表中,其密钥是截止日期(_echeancesParDate)。

每个截止日期都是连续管理的,只有一个linux计时器: - 当计时器到期时,它会产生一个信号; - signal的处理程序处理与截止日期相关的事件,然后,应在下一个截止日期重新启动计时器。

  

所以我需要在信号处理程序中使用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);
    }

我唯一的想法是重载multimap迭代器++运算符,使其适用于volatile修饰符... 但我不知道怎么做...对我的问题有什么看法? 感谢

1 个答案:

答案 0 :(得分:1)

所以,我发表评论说volatile在多线程环境中是一种难闻的气味,我坚持这一点。

在信号处理程序中操纵数据也是一种难闻的气味。使用锁也无法在信号处理程序中工作,因为没有其他线程可以解锁程序主线程所持有的锁。

我认为您需要重新考虑整个设计,并使用两个线程[其中一个可能由定时器信号处理程序控制,并具有高优先级]。关键是操纵迭代器和迭代器指向的数据必须以原子方式处理,只是标记某些内容volatile并不能解决问题 - volatile只意味着编译器必须“完全按照代码所说的去做“ - 但这并不意味着您的数据本身就是安全的。