Создание потокобезопасной переменной в C#

У меня есть статическая переменная, доступ к которой осуществляется несколькими потоками в нескольких объектах. Проблема в том, что если я установлю значение в одном потоке, оно не будет отражено в другом потоке. Чтобы решить эту проблему, я сделал переменную потока статической, но значение, измененное в одном потоке, все равно отражается в другом потоке. Вот как я объявил переменную:

[ThreadStatic]
public static string ThreadVar;

Любое предложение о том, как решить проблему?

1 ответ

Компилятор и JIT могут свободно предполагать, что поля не будут изменены несколькими потоками, и могут оптимизировать повторные выборки одного и того же поля, если можно доказать, что текущим потоком между выборками нельзя изменить значение.

Маркировка поля volatile сообщает об обратном: вы ожидаете, что поле будет изменено внешними силами (включая другие потоки), и что компилятор /JIT не должен оптимизировать любые повторные выборки.

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

[ThreadStatic]для сравнения, говорит компилятору, что у каждого потока должна быть своя собственная копия переменной, которая на основе вашего вопроса совсем не то, что вы хотите.

Другие вопросы по тегам