2015-12-27 3 views
2

Это обычно делается с использованием volatile. Но в случае long или double это невозможно.Сообщите компилятору, что переменная может быть обновлена ​​из другого потока

Возможно, достаточно просто сделать это public, и тогда компилятор знает, что это может использоваться другой сборкой и не будет «оптимизировать ее»? На что можно положиться? Какой-то другой способ?

Чтобы быть ясным, я не беспокоюсь о параллельном чтении/записи переменной. Только одно - это не оптимизировано. (Как в https://stackoverflow.com/a/1284007/939213.)

+0

Используйте класс Random, он будет иметь более предсказуемое поведение. Или System.Threading.Volatile –

+0

вы можете показать код, который, по вашему мнению, может быть оптимизирован? – Batavia

+0

Как вы планируете обновлять эту переменную «из другого потока»? На самом деле это не так, как работает управляемый код. – srandppl

ответ

0

Лучший способ предотвратить удаление кода - использовать код.

если вы беспокоиться о оптимизации время цикла в вашем примере

class Test 
{ 
    long foo; 

    static void Main() 
    { 
     var test = new Test(); 

     new Thread(delegate() { Thread.Sleep(500); test.foo = 255; }).Start(); 

     while (test.foo != 255) ; 
     Console.WriteLine("OK"); 
    } 
} 

вы все еще можете использовать летучими, чтобы сделать это, изменив ваше время цикла

volatile int temp; 

//code skipped in this sample 
while(test.foo != 255) { temp = (int)foo;} 

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

Убедитесь, что вы четко обозначили свой код, если вы делаете что-то вроде этого. возможно, напишите класс VolatileLong, который обертывает ваш длинный (и ваш volatile int), чтобы другие люди понимали, что вы делаете.

также другие инструменты для защиты от вторжений предотвращают удаление кода. например, компилятор достаточно умен, чтобы не удалять double, если в синелтонном шаблоне, подобном этому.

if (_instance == null) { 
    lock(_lock) { 
     if (_instance == null) { 
      _instance = new Singleton(); 
     } 
    } 
} 
return _instance; 
Смежные вопросы