должен ли я *всегда *синхронизировать доступ ко всем двойным полям/свойствам/переменным, которые используются из более чем одного потока?

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

Согласно этомуhttp://msdn.microsoft.com/en-us/library/aa691278%28VS.71%29.aspxdoubleобновление переменной не является атомарным.

Меня беспокоят два вопроса:

  • если один поток изменяет переменную поля или свойства, а другой поток читает ее одновременно , я хочу иметь либо предыдущее, либо новое значение, но я не хочу получать что-то странное. т.е. если один поток меняет значение с 5,5 на 15,15, я хочу, чтобы в другом потоке было одно из этих двух чисел, а не 5,15 или 15,5 или что-то еще.
  • если один поток уже обновил значение, а другой поток прочитал его после , я хочу получить последнее, актуальное значение. Я думал, что ключевое слово volatile может помочь с этим, но, похоже, это не так, потому что «Volatile не гарантирует свежесть значения. Оно предотвращает некоторые оптимизации, но не гарантирует синхронизацию потоков». как сказано здесь , являются ли примитивные массивы c #изменчивыми?

Вопросы:

  • Правильно ли я понимаю, что без синхронизации могут появиться обе эти проблемы?
  • Если вы можете привести мне короткий пример, который доказывает, что без синхронизации это не будет работать -, было бы неплохо
  • Как мне получить доступ к двойному полю, переменной или свойству, чтобы всегда иметь действительно актуальное значение? Будет ли «синхронизация» гарантировать «свежесть»? Что было бы самым быстрым способом для этого? спинлок или что?

В настоящее время я использую много doubleи decimalпеременных/полей/свойств в своей программе, и почти все работает нормально, поэтому я действительно запутался, потому что часто обращаюсь к ним из разных потоков без какой-либо синхронизации, и это просто работает... Но теперь думаю, что, наверное, было бы лучше использовать float, чтобы "встроить -в синхронизацию"

5
задан Community 23 May 2017 в 10:34
поделиться