Для каких (если есть?) STORE_ORDER
& LOAD_ORDER
гарантирует ли C ++ 11, что этот код выполняется за конечное время?
std::atomic<bool> a{false};
std::thread t{[&]{
while(!a.load(LOAD_ORDER));
}};
a.store(true, STORE_ORDER);
t.join();
Я вижу две проблемы с этим:
Порядок памяти
Мне кажется, что с release
& aquire
компилятору и процессору разрешается переупорядочивать мой join
(при условии, что он ведет себя как загрузка) до store
что, конечно, сломало бы это.
Даже с memory_order_seq_cst
, я не уверен, запрещено ли такое переупорядочение, потому что я не знаю, действительно ли join()
выполняет какие-либо загрузки или сохранения.
Visibility
Если я правильно понял этот вопрос о memory_order_relaxed
, то не гарантируется, что магазин с memory_order_relaxed
станет видимым для других потоков за конечное время,Есть ли такая гарантия для любого другого заказа?
Я понимаю, что std::atomic
- это атомарность и порядок в памяти, а не видимость.Но я не знаю никаких других инструментов в c ++ 11, которые могли бы мне здесь помочь.Нужно ли мне использовать инструмент для конкретной платформы, чтобы получить здесь гарантию правильности, и если да, то какую?
Чтобы сделать этот шаг еще дальше - если у меня есть конечность, было бы неплохо такжеесть обещание о скорости.Я не думаю, что стандарт C ++ дает такие обещания.Но есть ли какой-то компилятор или специфичный для x86 способ получить обещание, что хранилище станет видимым для другого потока быстро?
В заключение: я ищу способ быстро остановить работникапоток, который на самом деле гарантированно имеет это свойство.В идеале это не зависит от платформы.Но если у нас не может быть этого, существует ли оно хотя бы для x86?