спокойный порядок в качестве сигнала - PullRequest
4 голосов
/ 05 июля 2019

Допустим, у нас есть два потока. Тот, который дает "идти" и тот, который ждет, чтобы произвести что-то.

Правильно ли этот код или у меня может быть "бесконечный цикл" из-за кеша или чего-то в этом роде?

std::atomic_bool canGo{false};

void producer() {
    while(canGo.load(memory_order_relaxed) == false);
    produce_data();
}

void launcher() {
    canGo.store(true, memory_order_relaxed);
}

int main() {
    thread a{producer};
    thread b{launcher};
}

Если этот код неверен, есть ли способ очистить / аннулировать кэш в стандартном c ++?

1 Ответ

4 голосов
/ 05 июля 2019

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

Другими словами, вы обычно хотите дать release / приобретает семантику для такой сигнализации.

Это можно сделать либо с помощью memory_order_release в магазине и memory_order_acquire при загрузке, либо путем установки release забор до расслабленного хранилища и и приобретение забор после расслабленной нагрузки, чтобы операции памяти, выполненные сигнализатором перед хранением, были видны сигнальщику(см., например, https://preshing.com/20120913/acquire-and-release-semantics/ или стандарт C / C ++).


То, как я помню порядок заборов, заключается в том, что, насколько я понимаю, операции с общей памятью междуЯдра - это, по сути, аппаратно-реализованный буферизованный ввод-вывод, который следует протоколу, , и ограничение на освобождение должно быть похоже на очистку выходного буфера, а ограничение получения - на очистку / синхронизацию входного буфера.

Теперьесли ты смеешьбуфер вывода оперативной памяти нашего ядра до выдачи расслабленного хранилища, затем, когда целевое ядро ​​видит расслабленное хранилище, ему должны быть доступны предыдущие операционные сообщения памяти, и все, что ему нужно, чтобы увидеть эти изменения памяти в своей памятисинхронизировать их с ограждением получения после того, как оно увидит хранилище сигналов.

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