Мне нужно использовать изменчивый многоадресный итератор, но операторы итератора (такие как ++) не работают, если он определен как volatile ...Как использовать изменчивый многоадресный итератор?
Прежде всего: зачем нужен летучий итератор (и НЕ изменчивый)?
Я пишу полезный класс (Echeancier), который должен запланировать список сроков (Echeance), упорядоченных по дате. Все предельные сроки хранятся в мультимаре, чей ключ является датой крайнего срока (_echeancesParDate).
Каждый конечный срок управляется последовательно, только с одним таймером Linux: - когда таймер истекает, он генерирует сигнал; - обработчик сигнала обрабатывает событие, связанное с крайним сроком, а затем перезапускает таймер для следующего крайнего срока.
Так что мне нужно использовать typeListeEcheancesParDate :: iterator _comingEcheance в обработчике сигналов.
С другой стороны, класс Echeancier также определяет функцию для создания новых сроков (ajouterEcheance()). Эта функция может обновлять _comingEcheance.
Вот почему мне нужно определить _comingEcheance как изменчивое.
NB: На данный момент я отложил атомный подход доступа.
Моего исходный код (частичный):
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' для чего-либо, кроме аппаратных регистров, является« неприятным запахом »... Почему код, использующий' volatile' в первую очередь? Конечно, если какой-то другой поток может ими манипулировать, вам нужны правильные блокировки, чтобы другой поток не испортил текущие потоки, изменив список ... И с правильными блокировками «volatile» не нужен. –
Спасибо за ответ. – petitponey
Спасибо за ответ.Но я не использую этот код в многопоточном контексте; Мне нужна переменная volatile, потому что этот итератор модифицируется в функции обработчика сигнала; эта функция обработчика может быть вызвана асинхронно, в любой точке программы, непредсказуемо: это агент, внешний по отношению к основной программе (например, аппаратное прерывание). – petitponey