网上的测试例程,分别起10个线程对一个全局变量进行累加,分成累加函数无锁全局变量为long long、有锁全局变量为long long、全局变量使用原子变量三种情况
具体代码见:
https://www.stubbornhuang.com/781/纠正: 3楼说的对,没仔细看代码,这个问题估计就没什么意思了。把锁放到for里面去,结果 no.2 花了大概 55ms。 如果是就是原来的这个代码,也大致能理解,各种线程切换缓存处理命中可能会差一些
另外问一下,原子变量可以以任何类型作为模板参数,那在自定义类型情形下,这东西到底有什么作用,怎么个用法?不太理解
// no.1
void ThreadFunction()
{
for (int i=0;i<100000;++i)
{
globalCount += 1;
}
}
//no.2
void ThreadFunction()
{
std::lock_guard<std::mutex> lock(globalMutex);
for (int i=0;i<100000;++i)
{
globalCount += 1;
}
}
//no.3
std::atomic<long> globalCount = 0;
结果本机测试,速度上 no.1 ~ 15ms, no.2 ~ 5ms, no.3 ~ 25ms, 这怎么理解?然后这样的话,atomic 岂不是没啥意思了?
--
修改:confinement FROM 113.118.172.*
FROM 120.229.9.*