为什么在硬件保证一致性的情况下会出现竞争条件

问题描述 投票:0回答:1
#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 协议那样实现硬件级一致性时,共享内存不应该由硬件本身正确处理,这样就不会出现竞争条件吗?

c++ caching shared-memory race-condition
1个回答
0
投票

MESI 协议(维基百科)是一种提高维持CPU 缓存一致性性能的机制。

CPU 缓存(维基百科)是位于计算机的 CPU 和主内存之间的硬件组件。

CPU 缓存的一致性与线程安全性完全无关:

  • 您的代码,或者
  • 您的代码可能使用的
  • 集合,例如
    std::vector<>
    ,或者
  • 任何你可能用 C++ 做的事情,或者
  • 您甚至可以在机器代码中执行的任何操作,这就是 C++ 编译的结果。

换句话说,一个与另一个完全没有关系。

© www.soinside.com 2019 - 2024. All rights reserved.