我需要根据分钟间隔监视内部流量,因此我决定执行以下操作:

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/

10-10 22:28