#include <iostream>
#include <thread>
#include <vector>
#include <chrono>
#include <mutex>
using namespace std::chrono;
const int nthreads = 4;
const int64_t ndata = 1600000;
int total_sum = 0;
void compute_sum(int tid, std::vector<int>& d)
{
int st = (ndata / nthreads) * tid;
int en = (ndata / nthreads) * (tid + 1);
for (int i = st; i < en; i++) {
total_sum += d[i];
}
}
int main(int argc, char ** arg)
{
std::vector<std::thread> threads;
std::vector<int> data;
for (int i = 0; i < ndata; i++) {
data.push_back(i);
}
for (int i = 0; i < nthreads; i++) {
threads.push_back(std::thread(compute_sum, i, std::ref(data)));
}
for (auto &th : threads) {
th.join();
}
return 0;
}
这里total_sum在两个线程之间共享,因此会出现竞争条件,并且此代码会变得混乱(直到使用原子或锁)。 但是,当像 MESI 协议那样实现硬件级一致性时,共享内存不应该由硬件本身正确处理,这样就不会出现竞争条件吗?