2017-02-22 42 views
0

Насколько я знаю, переменная в потоке должна быть небезопасной, если не заблокирована. Но я попробовал это на Unity, и нашел, что это разные. Я стараюсь код ниже:переменная безопасность в единстве нить

void Awake() { 
     Thread thread = new Thread(new ThreadStart (demo)); 
     thread.Start(); 
     for (int i = 0; i < 5000; i++) { 
      count = count + 1; 
     } 
    } 

    void demo() { 
     for (int i = 0; i < 5000; i++) { 
      count = count + 1; 
     } 
    } 

И я стараюсь debug.log (COUNT), и каждый раз я пытаюсь его, что это 10000. Но это должно быть число, которое меньше, чем 10000 из-за не безопасность нитей, не так ли? Так может кто-нибудь сказать мне, почему?

+0

Можете ли вы отправить [mcve], чтобы мы могли скопировать-вставить и запустить ваш код? – Enigmativity

+0

вы можете показать нам код, в котором вы вызываете активный метод –

+0

@OusmaneDiaw - Нам нужен полный код, а не только вызов '.Awake()'. Нам нужен [mcve]. – Enigmativity

ответ

2

Вот Minimal, Complete, and Verifiable example вашего кода:

void Main() 
{ 
    Awake(); 
    Console.WriteLine(count); 
} 

private int count = 0; 

public void Awake() 
{ 
    Thread thread = new Thread(new ThreadStart(demo)); 
    thread.Start(); 
    for (int i = 0; i < 5000; i++) 
    { 
     count = count + 1; 
    } 
    thread.Join(); 
} 

public void demo() 
{ 
    for (int i = 0; i < 5000; i++) 
    { 
     count = count + 1; 
    } 
} 

Если вы бежите, что вы получите 10000 аут. Это связано с тем, что к моменту начала потока метод .Awake() завершил цикл, и поэтому конфликта не возникает.

Попробуйте изменить петли на for (int i = 0; i < 50000; i++), тогда результат, который я получил за один проход, - 89922. Он меняется каждый раз, но иногда я все еще получаю 100000.

+0

Спасибо за ответ, это мне очень помогает. – deadmarston

0

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