Я читаю документацию и, более конкретно, < /p>
memory_order_acquire < /strong>: операция нагрузки с этим порядком памяти выполняет
, чтобы получить операцию приобретения в зависимости от места памяти: нет чтения или
в текущем потоке может быть переупорядочена до этой загрузки. Все
записывает в других темах, которые выпускают одну и ту же атомную переменную,
видны в текущем потоке (см. Заказ о выпуске-акквийре ниже). < /P>
memory_order_release < /strong>: операция хранилища с этим порядком памяти
выполняет операцию релиза: No Reads или написано в текущем
Truded Thate. All writes in the current
thread are visible in other threads that acquire the same atomic
variable (see Release-Acquire ordering below) and writes that carry a
dependency into the atomic variable become visible in other threads
that consume the same atomic (see Release-Consume ordering below)
These two биты: < /p>
from memory_order_acquire < /em> < /p>
... без чтения или записи в текущем потоке может быть повторно порядок перед этой загрузкой ... < /p>
< /blockquote>
< /p>
< /blockquote> memore_order_release < /em> < /p>
... без чтения или записи в текущем потоке может быть повторно зарегистрировано после этого хранилища ... < /p>
< /blockquote>
Что именно они значат? />
#include
#include
#include
#include
std::atomic ptr;
int data;
void producer()
{
std::string* p = new std::string("Hello");
data = 42;
ptr.store(p, std::memory_order_release);
}
void consumer()
{
std::string* p2;
while (!(p2 = ptr.load(std::memory_order_acquire)))
;
assert(*p2 == "Hello"); // never fires
assert(data == 42); // never fires
}
int main()
{
std::thread t1(producer);
std::thread t2(consumer);
t1.join(); t2.join();
}
< /code>
Но я не могу понять, где применяются два бита, которые я цитировал. Я понимаю, что происходит, но на самом деле я не вижу повторного заказа, потому что код маленький.
Подробнее здесь: https://stackoverflow.com/questions/596 ... ase-in-c11