Вызывает ли запись того же значения в ту же ячейку памяти гонку данных?

Рассмотрим следующий код, который записывает одно и то же значение в одну и ту же ячейку памяти из нескольких потоков:

void f(int* buf, int n, int* p) {
    for(int i = 0; i < n; i++)
        buf[i] = i;
    *p = buf[n/2];
}

void g(int* buf, int n) {
    int x1, x2;
    thread t1(f, buf, n, &x1);
    thread t2(f, buf, n, &x2);
    t1.join();
    t2.join();
    assert(x1 == x2);
}

Хотя это интересно, меня меньше беспокоят гарантии, которые дает стандарт, поскольку я предполагаю, что он дает никто. Что меня действительно волнует, так это то, как будет вести себя приведенный выше код на реальном многопроцессорном оборудовании. Всегда ли assert будет проходить успешно или есть вероятность возникновения состояния гонки, проблем с синхронизацией кеша и т. Д.?

14
задан ybungalobill 29 November 2011 в 18:38
поделиться