попробуйте функцию whereRaw ()
https://laravel.com/docs/5.6/queries
Из документации:
Методы whereRaw и /WhereRaw могут использоваться для ввода предложения raw where в ваш запрос. Эти методы принимают необязательный массив привязок в качестве их второго аргумента:
$ orders = DB :: table ('orders') -> whereRaw ('price> IF (state = "TX",?, 100 ) ', [200]) -> get ();
нам нужно доказать, что
_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) уже завершено
Барьеры памяти не позволяют ЦП переупорядочивать доступ к объекту Element
, который не использует блокировки, через доступ к структуре очереди (здесь реализованы с использованием индексов, но указатели одинаково жизнеспособны).
Используя вашу нумерацию, важно, чтобы (3) выполнялось между (2) и (4), и барьер памяти обеспечивает это.
Точный случай, о котором вы спрашиваете о (2) -vs- (3) в источнике, предотвращает умозрительную перезапись действительных данных при заполнении очереди (предлагаемый сайт перекрывается с действительными данными). Без барьера, даже если условие не выполнено, исходные данные будут восстановлены с точки зрения потока источника, промежуточные значения могут быть кратко видны потребителю.