Без блокировки один производитель / один потребитель кольцевой буфер

попробуйте функцию whereRaw ()

https://laravel.com/docs/5.6/queries

Из документации:

Методы whereRaw и /WhereRaw могут использоваться для ввода предложения raw where в ваш запрос. Эти методы принимают необязательный массив привязок в качестве их второго аргумента:

$ orders = DB :: table ('orders') -> whereRaw ('price> IF (state = "TX",?, 100 ) ', [200]) -> get ();

3
задан Yoo 20 January 2019 в 17:10
поделиться

2 ответа

нам нужно доказать, что

_array[current_tail] = item; // push(3)

исключено после соответствия (current_head == current_tail)

item = _array[current_head]; // pop(3)

завершено. мы можем перезаписать ячейку, только после того, как данные из нее уже скопированы в элемент

,

_head.load(std::memory_order_acquire) // push(2)

синхронизированы с

_head.store(increment(current_head), std::memory_order_release);   //pop(4)

через упорядочение Release-Acquire:

все записи в память ( pop (3) ), которые произошли до того, как выпуск атомарного хранилища ( pop (4) ) на _head становятся видимыми побочными эффектами, как только Получение атомной нагрузки ( push (2) ) завершено _head.

, поэтому код производителя после push (2) завершен, гарантированно увидит результат pop (3) . это означает, что данные из _array[current_head] копируются в элемент, и результат этой операции виден для кода источника после push (2) , поэтому _array[current_head] уже свободен.

с другой стороны из memory_order_acquire описания загрузки - никакие операции чтения или записи ( push (3) ) в текущем потоке не могут быть переупорядочены до этой загрузки. поэтому push (3) будет выполнено уже после push (2) загрузки завершено, но на этом этапе pop (3) уже завершено

[114 ]
0
ответ дан RbMm 20 January 2019 в 17:10
поделиться

Барьеры памяти не позволяют ЦП переупорядочивать доступ к объекту Element, который не использует блокировки, через доступ к структуре очереди (здесь реализованы с использованием индексов, но указатели одинаково жизнеспособны).

Используя вашу нумерацию, важно, чтобы (3) выполнялось между (2) и (4), и барьер памяти обеспечивает это.

Точный случай, о котором вы спрашиваете о (2) -vs- (3) в источнике, предотвращает умозрительную перезапись действительных данных при заполнении очереди (предлагаемый сайт перекрывается с действительными данными). Без барьера, даже если условие не выполнено, исходные данные будут восстановлены с точки зрения потока источника, промежуточные значения могут быть кратко видны потребителю.

0
ответ дан Ben Voigt 20 January 2019 в 17:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: