Атоми c пиши и читай - PullRequest
       6

Атоми c пиши и читай

0 голосов
/ 18 марта 2020

Хотелось бы знать следующее:

  1. запись первого потока в atomi c переменная, например std :: atomi c i. Видит ли второй поток новое значение при следующей операции загрузки?

, например:

std::atomic<uint8_t> i=0;

thr1_func()
{
 i.store(1,std::memory_order_relaxed);//here is first step
}

thr2_func()
{
 while(!i.load(std::memory_order_relaxed);//here is next step
}

Будет ли переменная 'i' иметь новое значение при первой операции загрузки после операции сохранения? Или переменная 'i' может иметь новое значение при втором или другом выполнении команды?

Заранее благодарим вас.

Ответы [ 2 ]

2 голосов
/ 18 марта 2020

Видит ли второй поток новое значение при следующей операции загрузки?

Если следующая операция load происходит после store в порядке модификации этого атома c переменная затем load считывает значение из этого store.

См. std::memory_order для получения полной информации:

Порядок модификации

Все модификации любой конкретной переменной atomi c происходят в общем порядке, который указан c для этой переменной atomi c.

. ..

когерентность записи-чтения: если побочный эффект (запись) X на атоме c объекта M происходит - до вычисления значения (чтения) B из M, то оценка B должна принимать свое значение от X или от побочного эффекта Y, который следует за X в порядке изменения M

Кроме того, в [atomics.order] стандарт говорит, что :

Реализации должны сделать хранилища atomi c видимыми для загрузок atomi c в течение разумного промежутка времени.

На практике это означает, что компилятор выдает эти инструкции сохранения и загрузки, а затем до аппаратного обеспечения для распространения сохраненного значения и сделать его видимым для других процессоров. Процессоры x86 используют буфер хранения, так что сохраненное новое значение сначала попадает в буфер хранения и становится видимым для других процессоров через некоторое (небольшое) время после того, как он покинул буфер хранения. В течение этого времени ЦП, который сохранил значение, может прочитать его обратно из буфера хранилища, но другие ЦП не могут.

Дополнительная информация: Как сделать так, чтобы хранилища памяти в одном потоке «быстро» были видны в другие темы?

0 голосов
/ 18 марта 2020

Этот ответ: { ссылка }

И если вам нужно узнать, произошла ли загрузка после того, как магазин или магазин еще не произошли (т.е. отложить загрузку до магазина) ... вы может ввести другую переменную или использовать «недопустимое значение», например ноль, а затем выполнить проверку «сравнения_обмена» для этого недопустимого значения, чтобы при загрузке можно было узнать, произошло ли сохранение, и сохранить может проверить, было ли уже загружено значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...