【发布时间】:2017-04-07 09:39:18
【问题描述】:
我想了解如何编写线程安全代码。
例如,我的游戏中有这段代码:
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等方法读写值?如果我用
lock (_someObject)包围_done读写操作,我需要使用Interlocked或其他东西来防止缓存吗?
编辑 1
- 如果我将
_done定义为volatile并从多个线程调用Update方法。在我将_done赋值为false 之前,是否有2 个线程会进入if语句?
【问题讨论】:
-
不使用
threads,不如试试tasks? -
@MAdeelKhalid,我用
Unity3d引擎,它只支持框架2 -
请注意,线程很昂贵(相对而言)每次启动一个新线程可能并不理想
-
我明白你在做什么。您只是想从另一个
Thread在主Thread中执行某些操作。您现在拥有的是一种基本方法,但不应在生产代码中使用它。你需要一个队列系统。在this 发帖了解正确的方法。我为此做了一个UnityThread课程。 -
如果你想使用多线程,我建议使用库。例如,UniRX 为 Unity 提供了一个简洁的线程池和任务替换,并且还附带了所有的 Rx 工具集(顾名思义,嗯),这有助于获得正确的异步性。
标签: c# multithreading unity3d