Нужен дизайн от края до края? Откажитесь от родителя
.container
или.container-fluid
.Тем не менее, если вам нужно удалить отступы из
.row
и немедленных дочерних столбцов, вы должны добавить класс.no-gutters
с кодом из @Brian выше в ваш собственный CSS-файл, на самом деле это не «прямо из коробки», проверьте здесь официальные сведения о финальной версии Bootstrap 4: https://getbootstrap.com/docs/4.0/layout/grid / # нет-желобов
Большинство ответов использует слово, "атомарное", как будто атомарные изменения - все, что необходимо. Они не, обычно.
Это было упомянуто в комментариях, но не обычно в ответах - это - единственная причина для меня предоставляющий этот ответ. (Точка о блокировке при более грубой гранулярности, для разрешения вещей как добавление, совершенно допустима также.)
Обычно Вы хотите, чтобы поток чтения видел последний значение переменной/свойства. То, что не гарантируется атомарностью . Как быстрый пример, вот плох способ остановить поток:
class BackgroundTaskDemo
{
private bool stopping = false;
static void Main()
{
BackgroundTaskDemo demo = new BackgroundTaskDemo();
new Thread(demo.DoWork).Start();
Thread.Sleep(5000);
demo.stopping = true;
}
static void DoWork()
{
while (!stopping)
{
// Do something here
}
}
}
DoWork
может циклично выполниться навсегда, несмотря на запись к логической переменной, являющейся атомарным - нет ничего, чтобы мешать JIT кэшировать значение stopping
в DoWork
. Для фиксации этого или необходимо заблокировать, сделать переменную volatile
или использовать явный барьер памяти. Это все относится к свойствам строки также.
Ваш второй пример кода является определенно не правильным, потому что блокировки только имеют желаемый эффект, когда они используются в весь места, где к переменной получают доступ (и для, добираются и набор), таким образом, эти get
также нуждался бы в блокировке.
Однако при получении и установке поля ссылочного типа, поскольку свойство как это, затем добавлении оператора блокировки не добавляет значения. Присвоения на указатели, как гарантируют, будут атомарными в среде.NET, и если несколько потоков изменяют свойство тогда, у Вас есть свойственное состояние состязания так или иначе (где потоки могут видеть различные значения; это может или не может быть проблемой), таким образом, существует мало точки в блокировке.
Так для того, что это делает, первая часть кода прекрасна. Но ли Вы действительно хотите встроить свойственные условия состязания в многопоточное приложение, другой вопрос.
Value="ActionDataKey1=Value1;ActionDataKey2=Value2"
.
– Marco Ciambrone
1 September 2014 в 10:57
Установка строки является атомарной операцией, т.е. Вы или получите новую строку или старую строку, Вы никогда не будете получать мусора.
, Если Вы делаете некоторую работу, например,
obj.SampleProperty = "Dear " + firstName + " " + lastName;
тогда строковая конкатенация, все происходит перед вызовом для установки поэтому sampleField всегда или будет новой строкой или старым.
, Если однако Ваш строковый код конкатенации сам справочный, например,
obj.SampleProperty += obj.SampleProperty + "a";
и еще где на другом потоке Вы имеете
obj.SampleProperty = "Initial String Value";
Тогда, Вам нужна блокировка.
Полагают, что Вы работаете с интервалом, Если Вы присваиваете интервалу, и любое значение, которое Вы получаете от интервала, допустимо, тогда Вы не должны блокировать его.
Однако, если интервал проводит подсчет количества виджетов, обработанных двумя или больше потоками для количества, чтобы быть точным, необходимо заблокировать интервал. Это - та же ситуация для строк.
у меня есть чувство, что я не объяснил это очень хорошо, надеялся, что это помогает.
Спасибо
BW
Поле ссылочного типа, get/set (ldfld/stfld), (IIRC), который, как гарантируют, будет атомарным, таким образом, не должно быть никакого риска повреждения здесь. Таким образом, это должно быть ориентировано на многопотоковое исполнение от , что угол, но лично я заблокировал бы данные в более высоком уровне - т.е.
lock(someExternalLock) {
record.Foo = "Bar";
}
или возможно:
lock(record.SyncLock) {
record.Foo = "Bar";
}
Это позволяет Вам делать несколько чтений/обновлений к тому же объект как атомарная операция, так, чтобы другие потоки не могли получить состояние недопустимого объекта
Это ориентировано на многопотоковое исполнение без любой потребности в блокировке. Строки являются ссылочными типами, поэтому только ссылка на строку изменяется. Ссылки имеют тип, как, гарантируют, будут атомарными (Int32 в системах на 32 бита и Int64 на 64 битах).
session.CustomActionData.ToString()
.
– rustyx
7 March 2015 в 22:31