Является ли свойство строки самим потокобезопасным?

Нужен дизайн от края до края? Откажитесь от родителя .container или .container-fluid.

Тем не менее, если вам нужно удалить отступы из .row и немедленных дочерних столбцов, вы должны добавить класс .no-gutters с кодом из @Brian выше в ваш собственный CSS-файл, на самом деле это не «прямо из коробки», проверьте здесь официальные сведения о финальной версии Bootstrap 4: https://getbootstrap.com/docs/4.0/layout/grid / # нет-желобов

30
задан TomTom 12 January 2009 в 09:23
поделиться

5 ответов

Большинство ответов использует слово, "атомарное", как будто атомарные изменения - все, что необходимо. Они не, обычно.

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

Обычно Вы хотите, чтобы поток чтения видел последний значение переменной/свойства. То, что не гарантируется атомарностью . Как быстрый пример, вот плох способ остановить поток:

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 или использовать явный барьер памяти. Это все относится к свойствам строки также.

41
ответ дан Jon Skeet 12 January 2009 в 09:23
поделиться
  • 1
    Alexey, благодарит занять время для описывания этого. Это было действительно большой справкой ко мне. К сожалению, я могу только дать Вам +1... – Tim Long 17 January 2013 в 20:05

Ваш второй пример кода является определенно не правильным, потому что блокировки только имеют желаемый эффект, когда они используются в весь места, где к переменной получают доступ (и для, добираются и набор), таким образом, эти get также нуждался бы в блокировке.

Однако при получении и установке поля ссылочного типа, поскольку свойство как это, затем добавлении оператора блокировки не добавляет значения. Присвоения на указатели, как гарантируют, будут атомарными в среде.NET, и если несколько потоков изменяют свойство тогда, у Вас есть свойственное состояние состязания так или иначе (где потоки могут видеть различные значения; это может или не может быть проблемой), таким образом, существует мало точки в блокировке.

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

0
ответ дан Greg Beech 12 January 2009 в 09:23
поделиться
  • 1
    Если необходимо передать более тогда один параметр, Вы не можете добавить другой CustomAction, они перезаписывают, но необходимо установить параметры, разделяющие их с точкой с запятой: 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

4
ответ дан Binary Worrier 12 January 2009 в 09:23
поделиться
  • 1
    Не понял его, пока я на самом деле не выполнил его. Тогда я видел логику. Путь к небольшой ХОРОШЕЙ читаемой информации об этой теме. Спасибо! – Wolf5 9 June 2014 в 16:43

Поле ссылочного типа, get/set (ldfld/stfld), (IIRC), который, как гарантируют, будет атомарным, таким образом, не должно быть никакого риска повреждения здесь. Таким образом, это должно быть ориентировано на многопотоковое исполнение от , что угол, но лично я заблокировал бы данные в более высоком уровне - т.е.

lock(someExternalLock) {
    record.Foo = "Bar";
}

или возможно:

lock(record.SyncLock) {
    record.Foo = "Bar";
}

Это позволяет Вам делать несколько чтений/обновлений к тому же объект как атомарная операция, так, чтобы другие потоки не могли получить состояние недопустимого объекта

17
ответ дан Marc Gravell 12 January 2009 в 09:23
поделиться
  • 1
    Поскольку @TimLong сказал, огромное спасибо. Желание я мог +1 это многие, много раз. – Lynn Crumbling 19 November 2013 в 22:28

Это ориентировано на многопотоковое исполнение без любой потребности в блокировке. Строки являются ссылочными типами, поэтому только ссылка на строку изменяется. Ссылки имеют тип, как, гарантируют, будут атомарными (Int32 в системах на 32 бита и Int64 на 64 битах).

0
ответ дан Tim Cooper 12 January 2009 в 09:23
поделиться
  • 1
    Вы don' t должны следовать за парным значением ключа форматом, можно обеспечить любой строковое значение и считать его с session.CustomActionData.ToString(). – rustyx 7 March 2015 в 22:31
Другие вопросы по тегам:

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