Использование Thread.VolatileWrite () с параметрами массива - PullRequest
3 голосов
/ 17 января 2009

Я хочу использовать Thread.VolatileWrite() (или эквивалентную функцию), чтобы изменить значение поля T[], чтобы обновленное значение было сразу видно всем остальным потокам. Однако метод не предоставляет универсальной версии, и я не могу использовать перегрузку Object, так как он принимает параметр ref.

Есть ли альтернатива? Interlocked.Exchange<T> сделает работу? Есть ли лучший способ добиться того, что я хочу сделать?

Ответы [ 2 ]

8 голосов
/ 17 января 2009

VolatileWrite полезно только в том случае, если вы также используете VolatileRead; модификатор volatile проще в использовании, но мне интересно, не будет ли проще использовать синхронизацию - возможно, ReaderWriterLockSlim (поскольку у вас много читателей).

Interlocked.Exchange<T> просто выполняет получение и установку в качестве атомарной операции; он (AFAIK) не претендует на волатильность (действительно, компилятор даже сообщает вам, что поле volatile не будет рассматриваться как volatile при использовании в качестве аргумента ref).


Измените, чтобы уточнить, что «он не (AFAIK) заявляет о волатильности» - поведение Interlocked предсказуемо, и вы должны немедленно увидеть обновления в другом потоке , если они также используют Interlocked; я хочу сказать, что если один поток использует Interlocked, а другой использует volatile (для разговора с одним и тем же полем), я не знаю никаких гарантий. Придерживайтесь одного или другого для доступа all .

2 голосов
/ 17 января 2009

Вы можете использовать модификатор volatile . Но проверьте документацию, чтобы увидеть, что ограничение не относится к вашему делу. И, вероятно, за его использование снижается производительность.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...