我需要使用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修饰符... 但我不知道怎么做...对我的问题有什么看法? 感谢
答案 0 :(得分:1)
所以,我发表评论说volatile
在多线程环境中是一种难闻的气味,我坚持这一点。
在信号处理程序中操纵数据也是一种难闻的气味。使用锁也无法在信号处理程序中工作,因为没有其他线程可以解锁程序主线程所持有的锁。
我认为您需要重新考虑整个设计,并使用两个线程[其中一个可能由定时器信号处理程序控制,并具有高优先级]。关键是操纵迭代器和迭代器指向的数据必须以原子方式处理,只是标记某些内容volatile
并不能解决问题 - volatile
只意味着编译器必须“完全按照代码所说的去做“ - 但这并不意味着您的数据本身就是安全的。