LINUX.ORG.RU

История изменений

Исправление placement_new, (текущая версия) :

volatile bool ready = false;
int data = 0;

int main()
{
    std::thread t1([&]() {
        data = 42;
        std::atomic_thread_fence(std::memory_order_release);
        ready = true;
    });
    std::thread t2([&]() {
        while (!ready) {
            std::this_thread::yield();
        }
        std::atomic_thread_fence(std::memory_order_acquire);
        assert(data == 42);
    });
    t1.join();
    t2.join();
}

У меня в коде нет ни одного атомика (явного:)), тем не менее код на x86 будет прекрасно работать.

Исходная версия placement_new, :

volatile bool ready = false;[]
int data = 0;

int main()
{
    std::thread t1([&]() {
        data = 42;
        std::atomic_thread_fence(std::memory_order_release);
        ready = true;
    });
    std::thread t2([&]() {
        while (!ready) {
            std::this_thread::yield();
        }
        std::atomic_thread_fence(std::memory_order_acquire);
        assert(data == 42);
    });
    t1.join();
    t2.join();
}

У меня в коде нет ни одного атомика (явного:)), тем не менее код на x86 будет прекрасно работать.