gpt4 book ai didi

c++ - 如何使用 volatile multimap 迭代器?

转载 作者:行者123 更新时间:2023-11-30 05:30:51 25 4
gpt4 key购买 nike

我需要使用volatile multimap迭代器,但是迭代器的操作符(比如++)​​在定义为volatile时不起作用...

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

我编写了一个实用程序类 (Echeancier),它必须安排按日期排序的截止日期列表 (Echeance)。所有截止日期都存储在一个 multimap 中,其键是截止日期 (_echeancesParDate)。

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

So I need to use typeListeEcheancesParDate::iterator _comingEcheance in a signal handler.

另一方面,类 Echeancier 还定义了一个函数来创建新的截止日期 (ajouterEcheance())。此函数可能会更新 _comingEcheance。

That's why I need to define _comingEcheance as 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 修饰符一起使用...但我不知道该怎么做......对我的问题有什么想法吗?谢谢

最佳答案

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

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

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

关于c++ - 如何使用 volatile multimap 迭代器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35778416/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com