Я хотел бы понять, как писать потокобезопасный код.
Например, у меня есть этот код в моей игре:
bool _done = false;
Thread _thread;
// main game update loop
Update()
{
// if computation done handle it then start again
if(_done)
{
// .. handle it ...
_done = false;
_thread = new Thread(Work);
_thread.Start();
}
}
void Work()
{
// ... massive computation
_done = true;
}
Если я правильно понимаю, может случиться так, что основной игровой поток и мой _thread
могут иметь свою собственную кешированную версию _done
, и один поток никогда не увидит, что _done
изменено в другом потоке?
И если это возможно, как его решить?
-
Можно ли разрешить, только применяя ключевое слово
volatile
. -
Или можно читать и записывать значения с помощью методов
Interlocked
, таких какExchange
иRead
? -
Если я окружаю
_done
операцию чтения и записи сlock (_someObject)
, мне нужно использоватьInterlocked
или что-то, чтобы предотвратить кеширование?
Изменить 1
- Если я определяю
_done
какvolatile
и вызывать методUpdate
из нескольких потоков. Возможно ли, что 2 потока войдут в операторif
, прежде чем присваивать_done
false?