我正在编写的程序需要在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实际上的内存占用量是多少?
答案 0 :(得分:4)
您可以在此处自行查看:https://godbolt.org/g/6zjJCU - 未启用任何优化,std::atomic
和常规变量都占用相同的内存量。
然而,差异在于对变量的访问。尝试取消注释块...您将获得所有静态调用和数据保护。
如果你做了很多读/写操作,互斥锁可能更有效 - 也许你可以锁定互斥锁,然后读取100字节的数据?另外,要小心脏读/写:如果你读取一个原子,用值做一些事情,然后尝试更新原子,交错线程可能已经改变了原子的值。使用稍微昂贵的互斥锁可以很容易地避免这种情况。
答案 1 :(得分:1)
根据this,引用atomic
只有一个模板类型的成员。它还具有unsigned int
的特化,但它没有提供基本类型的那么多。在记忆方面,你应该没问题。