C++ 关于对静态变量的同步访问

C++ 关于对静态变量的同步访问,c++,C++,我怀疑对静态变量的访问。 我正在使用一个模拟器,它每秒启动一个必须下载文件的应用程序。在应用程序的类中,当下载完成时,我递增另一个类(您可以在下面看到)中声明的计数器。 我可以看到我在哪里运行我的模拟,如果想要从main中获得计数器值,这个值总是一个不同的值(通常是我期望的实际值的非常小的比较)。所以我认为是可以修改这个变量的不同应用程序的同步问题。你觉得怎么样 这是我声明计数器的类: //infonet.cc #include "infonet.h" namespace ns3 { uin

我怀疑对静态变量的访问。 我正在使用一个模拟器,它每秒启动一个必须下载文件的应用程序。在应用程序的类中,当下载完成时,我递增另一个类(您可以在下面看到)中声明的计数器。 我可以看到我在哪里运行我的模拟,如果想要从main中获得计数器值,这个值总是一个不同的值(通常是我期望的实际值的非常小的比较)。所以我认为是可以修改这个变量的不同应用程序的同步问题。你觉得怎么样

这是我声明计数器的类:

//infonet.cc
#include "infonet.h"

namespace ns3 {

uint32_t infonet::totalDownloaded = 0;

void infonet::incrementTotalDownloaded()
{
    totalDownloaded++;
}
在infonet.h中,我只有一个

static uint32_t totalDownloaded; 
static void incrementTotalDownloaded();
infonet();
virtual ~infonet();
在应用程序的I类中,当应用程序停止时,递增计数器(应用程序仅在完成下载时停止)

在main.cc中,我安装了几个应用程序,在模拟结束时,我希望通过以下方式获得值:

uint32_t val = infonet::totalDownloaded;

这确实是一个灾难的秘诀:在uint21上使用C++11中可用的原子积分类型之一:++。它不是线程安全的。是否应该在头中将变量声明为
static
?有什么要说的,但不经常,并发的非原子增量几乎是安全的,但不是完全安全的。增量大约需要3个周期,因此,如果在3 GHz CPU上每秒随机发生一次,增量出错的概率为1:100000000。既然您说您经常看到小的差异,那么我假设您确实具有更高的并发性。不管怎样,它都不会改变任何东西,为了正确性,您需要使用原子增量或锁。谢谢大家,我将使用原子类型!
uint32_t val = infonet::totalDownloaded;