, И если этого не произойдет, то все равно будет правильно.

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

Затем основной поток объединяет все рабочие потоки. Симуляция этого выглядит примерно так (я прокомментировал возможное исправление, которое не знаю, нужно ли это):

#include <thread>
#include <atomic>
#include <vector>
#include <iostream>
#include <cassert>

using namespace std;

//atomic_bool success = true;
bool success = true;

int main()
{
    vector<thread> v;
    for (int i = 0; i < 10; ++i)
    {
        v.emplace_back([=]
        {
            if (i == 5 || i == 6)
            {
                //success.store(false, memory_order_release);
                success = false;
            }
        });
    }
    for (auto& t : v)
        t.join();

    //assert(success.load(memory_order_acquire) == false);
    assert(success == false);

    cout << "Finished" << endl;
    cin.get();
    return 0;
}

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

я нашел этоТема :: присоединиться () полный барьер памяти (источник) но подразумевает ли этосинхронизирована-с связь со следующим чтениемуспех переменная из основного потока, чтобы мы гарантированно получили новейшее значение?

Является ли исправление, которое я выложил (в закомментированном коде), необходимо в этом случае (или, может быть, другое исправление, если оно неверно)?

Есть ли вероятность, что читатьуспех переменная будет оптимизирована (так как она не является изменчивой), и мы получим старое значение независимо отпредполагается существовать скрытый барьер памяти наТема :: присоединиться?

Предполагается, что код работает на нескольких архитектурах (не могу вспомнить все из них, у меня нет make-файла передо мной), но есть по крайней мере x86, amd64, itanium, arm7.

Спасибо за любую помощь с этим.

Изменить: я изменил пример, потому что в реальной ситуации более чем один поток может попытаться написать вуспех переменная.

Ответы на вопрос(1)

Ваш ответ на вопрос