#include <iostream>
#include <future>
#include <chrono>
using namespace std;
using namespace std::chrono;
int a = 0;
int padding[16]; // avoid false sharing
int b = 0;
promise<void> p;
shared_future<void> sf = p.get_future().share();
void func(shared_future<void> sf, int &data)
{
sf.get();
auto t1 = steady_clock::now();
while (data < 1'000'000'000)
++data;
auto t2 = steady_clock::now();
cout << duration<double, ratio<1, 1>>(t2 - t1).count() << endl;
}
int main()
{
thread th1(func, sf, ref(a)), th2(func, sf, ref(b));
p.set_value();
th1.join();
th2.join();
return 0;
}
我使用上面的代码来演示虚假共享对性能的影响。但令我惊讶的是,填充似乎根本没有加速程序。有趣的是,如果两者a
都是b
原子变量,则有明显的改进。有什么不同?