我需要根据分钟间隔监视内部流量,因此我决定执行以下操作:
Flow{
void send();
static uint accumulator;
}
//Only single thread call to send
void Flow::sendPacket(pck){
accumulator+=pck.size();
do();
}
//Only single thread call to monitor . **No the same thread that call to send!**
Monitor::monitor(){
//Start monitor
Flow::accumulator = 0;
sleep(60);
rate = accumulator/60;
}
如果没有使用atomic,是否可以初始化为0的风险无法正确发生?
我担心的是,即使是原子也不会保证init,因为如果同时将init监视为0,并且同时用旧值进行累加,则新的累加值将基于旧值而不是init值。
另外,我还担心原子惩罚。每个数据包都会调用send。
最佳答案
易失性在多线程方面无济于事。您需要防止同时更新accumulator
的值,并防止在另一个线程读取该值的同时进行更新。如果您具有C ++ 11,则可以使accumulator
原子化:std::atomic<uint> accumulator;
否则,您需要在对其值的所有访问周围锁定一个互斥锁。
关于c++ - C++线程安全累加器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12180820/