Привязка C#

Эти константы не имеют никакого отношения к знаку. Это имеет смысл, если вы считаете двойной как составной из трех частей: Sign, Exponent и Mantissa. Double.MIN_VALUE на самом деле является наименьшим значением, которое может предполагать Мантисса, когда показатель экспоненты находится в минимальном значении до того, как произойдет сброс нуля. Аналогично MAX_VALUE можно понимать как наибольшее значение, которое может быть допущено Мантиссой, когда показатель экспоненты находится на максимальном значении до того, как возникнет поток к бесконечности.

Более описательное имя для этих двух может быть Самый большой Абсолют (добавьте ненулевое значение для verbositiy) и значение Smallest Absolute (добавьте бесконечность для verbositiy).

Проверьте IEEE 754 (1985) стандарт для деталей. Существует пересмотренная версия (2008), но это только вводит больше форматов, которые даже не поддерживаются java (строго говоря, Java даже не поддерживает некоторые обязательные функции IEEE 754 1985, как и многие другие языки высокого уровня).

14
задан Mark Cidade 23 September 2008 в 00:44
поделиться

7 ответов

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

поля Static не являются единственными вещами, которые нуждаются в синхронизации, любая общая ссылка, которая могла быть изменена, уязвима для проблем синхронизации.

class Foo
{
    private int count = 0;
    public void TrySomething()    
    {
        count++;
    }
}

Вы могли бы предположить, что два потока, выполняющие метод TrySomething, будут прекрасны. Но нет.

  1. Поток чтения значение количества (0) в регистр, таким образом, это может быть увеличено.
  2. Контекстное переключение! Планировщик потока решает, что поток A имел достаточно времени выполнения. Затем в строке Поток B.
  3. Поток B читает значение количества (0) в регистр.
  4. Поток B увеличивает регистр.
  5. Поток B сохраняет результат (1) для подсчета.
  6. Контекстное переключение назад к A.
  7. Поток перезагрузки регистр со значением количества (0) экономил на своем стеке.
  8. Поток инкременты регистр.
  9. Поток A сохраняет результат (1) для подсчета.

Так, даже при том, что мы назвали количество ++ дважды, значение количества только что пошло от 0 до 1. Позволяет делают код ориентированным на многопотоковое исполнение:

class Foo
{
    private int count = 0;
    private readonly object sync = new object();
    public void TrySomething()    
    {
        lock(sync)
            count++;
    }
}

Теперь, когда Поток A получает прерванный Поток, B не может смешать с количеством, потому что это поразит оператор блокировки и затем блок, пока Поток A не выпустил синхронизацию.

Между прочим, существует альтернативный способ сделать постепенное увеличение Int32s и Int64s ориентированный на многопотоковое исполнение:

class Foo
{
    private int count = 0;
    public void TrySomething()    
    {
        System.Threading.Interlocked.Increment(ref count);
    }
}

Относительно второй части Вашего вопроса, я думаю, что просто пошел бы с тем, какой бы ни легче читать, любое различие в производительности, там будет незначительно. Ранняя оптимизация является корнем всего зла, и т.д.

, Почему поточная обработка трудна

23
ответ дан 1 December 2019 в 07:20
поделиться

Чтение или запись 32-разрядного или меньшего поля являются атомарной операцией в C#. Нет никакой потребности в блокировке в коде, который Вы представили, насколько я вижу.

8
ответ дан 1 December 2019 в 07:20
поделиться

Это смотрит на меня, что блокировка является ненужной в Вашем первом случае. Используя статический инициализатор для инициализации панели, как гарантируют, будет ориентирован на многопотоковое исполнение. Так как Вы только когда-либо читаете значение, нет никакой потребности заблокировать его. Если значение, никогда не собирающееся измениться, никогда не будет никакой конкуренцией, почему блокировка вообще?

3
ответ дан 1 December 2019 в 07:20
поделиться

Грязные чтения?

1
ответ дан 1 December 2019 в 07:20
поделиться

Что касается Ваш, "который является лучшим" вопросом, они - то же, так как функциональный объем не используется ни для чего больше.

0
ответ дан 1 December 2019 в 07:20
поделиться

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

, Который сказал †“, я приезжаю из земли Java, где все чтения и записи переменных являются атомарными действиями. Другие ответы здесь предполагают, что.NET отличается.

1
ответ дан 1 December 2019 в 07:20
поделиться

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

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

Редактирование: Как Mark указал, поскольку определенные примитивы в чтениях C# являются всегда атомарными. Но будьте осторожны с другими типами данных.

1
ответ дан 1 December 2019 в 07:20
поделиться
Другие вопросы по тегам:

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