Примечание. Я предпочитаю писать свободный код блокировки -, поэтому по возможности стараюсь избегать любых типов блокировки. Вместо этого я просто использую цикл 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
, чтобы "встроить -в синхронизацию"
задан Community 23 May 2017 в 10:34
поделиться