2014-11-02 5 views
1

Вот программа, которую я написал для тестирования базового сценария потоковой передачи. Он работает точно так, как ожидалось, когда я запускаю его с включенной отладкой.C#/VS2013 - Почему этот код выходит из строя без отладки?

using System; 
using System.Threading; 

class Program 
{ 
    static bool keepCounting; 

    static void Main(string[] args) 
    { 
     Thread myThread = new Thread(countNumbers); 
     myThread.Name = "MyThread"; 

     keepCounting = true; 
     myThread.Start(); 
     Thread.Sleep(new TimeSpan(0, 0, 1)); // countNumbers() runs for 1 sec. 
     keepCounting = false; 
    } 

    static void countNumbers() 
    { 
     Console.WriteLine("{0} beginning count.", Thread.CurrentThread.Name); 
     long n = 0; 
     while (keepCounting) 
     { 
      n++; 
     } 
     Console.WriteLine("Current thread:   {0}", Thread.CurrentThread.Name); 
     Console.WriteLine("Number of iterations: {0}", n); 
    } 
} 

Однако, когда я установил VS, чтобы сделать сборку выпуска, и запустить его с помощью «Start Without Debugging» - обратите внимание, что оба этих шага должны быть приняты, или же он все равно будет иметь успех - это загадочно «застревает» где-то посредине метода countNumbers() после печати «Начало начала MyThread», и он никогда не истекает и печатает результат в окне консоли.

Может ли кто-нибудь объяснить эту глупость?

+0

Это может применяться: http://msdn.microsoft.com/en-us/library/x13ttww7.aspx –

+2

В частности, вам может потребоваться отметить 'keepCounting' как' volatile'. –

+0

@MichaelPetch, да. Вот и все. – dgmulf

ответ

3

Ваш цикл

while (keepCounting) 
{ 
    n++; 
} 

ли, насколько язык обеспокоен, что эквивалентно

var cpu_register = keepCounting; 
while (cpu_register) 
{ 
    n++; 
} 

регистров процессора намного быстрее, чем память читает, поэтому оптимизатор использует вторую версию. С предсказуемыми несчастливыми результатами для вас.

+0

Да, это объясняет! Использование ключевого слова «volatile» подавило оптимизацию и сделало мою программу работоспособной. Вы, люди, хорошо осведомлены. :) – dgmulf

Смежные вопросы