在实践中,在C ++ 11中std :: atomic的内存占用量是多少?

时间:2018-05-28 05:14:35

标签: c++ multithreading c++11 atomic

我正在编写的程序需要在ram中存储大量数据(几千兆字节),以便由多个线程以原子方式访问。 > lm(formula = sr ~ ddpi + ddpi^2, data = savings) > > Residuals: > Min 1Q Median 3Q Max > -8.5535 -3.7349 0.9835 2.7720 9.3104 > > Coefficients: > Estimate Std. Error t value Pr(>|t|) >(Intercept) 7.8830 1.0110 7.797 4.46e-10 *** >ddpi 0.4758 0.2146 2.217 0.0314 * > --- Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 > > Residual standard error: 4.311 on 48 degrees of freedom Multiple > R-squared: 0.0929, Adjusted R-squared: 0.074 F-statistic: 4.916 on > 1 and 48 DF, p-value: 0.03139 似乎是一种合理的方法,因为它的访问可能比在一个或多个std::atomic中包装所有访问更有效,因为在最坏的情况下,它将在内部使用互斥锁并且是等同的。

我的数据被组织为一组std::mutex个对象,其中包含一个包含大部分数据的数组成员。现在,我正在考虑将其定义为Chunk,但如果std::array<std::atomic<unsigned int>, SOME_CONSTANT_HERE>对内置类型(如std::atomic)的内存占用量并不差,那么这只会有效。 unsigned int本身,根据我的计算,我需要存储的数据量,当前常见的RAM容量勉强够用。

我看到的唯一替代方案(其他替代方案是受欢迎的)是让每个块都有自己的unsigned int实例,但这是有问题的,因为通常线程需要同时使用多个块(不是然而,几乎全部,并且持有多个锁对于死锁都是有问题的,并且由于各种线程访问块的模式将导致显着的争用。

那么,对于整数类型,std::mutex的x86_64实际上的内存占用量是多少?

编辑:我尝试在Google上搜索,甚至在GNU标准库源代码中挖掘一下也无济于事。

2 个答案:

答案 0 :(得分:4)

您可以在此处自行查看:https://godbolt.org/g/6zjJCU - 未启用任何优化,std::atomic和常规变量都占用相同的内存量。

然而,差异在于对变量的访问。尝试取消注释块...您将获得所有静态调用和数据保护。

如果你做了很多读/写操作,互斥锁可能更有效 - 也许你可以锁定互斥锁,然后读取100字节的数据?另外,要小心脏读/写:如果你读取一个原子,用值做一些事情,然后尝试更新原子,交错线程可能已经改变了原子的值。使用稍微昂贵的互斥锁可以很容易地避免这种情况。

答案 1 :(得分:1)

根据this,引用atomic只有一个模板类型的成员。它还具有unsigned int的特化,但它没有提供基本类型的那么多。在记忆方面,你应该没问题。