Лучший способ предотвратить удаление кода - использовать код.
если вы беспокоиться о оптимизации время цикла в вашем примере
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;
Используйте класс Random, он будет иметь более предсказуемое поведение. Или System.Threading.Volatile –
вы можете показать код, который, по вашему мнению, может быть оптимизирован? – Batavia
Как вы планируете обновлять эту переменную «из другого потока»? На самом деле это не так, как работает управляемый код. – srandppl