Mor*_*ess 2 iphone multithreading cocoa-touch objective-c nsthread
我的应用程序中有2个线程,一个游戏更新线程和渲染/ IO /主线程.我的更新线程更新游戏状态,渲染线程根据游戏状态模型的更新值和存储在对象(gameEngine)中的一些其他变量来渲染场景.
渲染线程在游戏线程仍在更新时执行,这是一个问题,因此在我看来,解决方案是使用@synchronized,如下所示:
@synchronized(gameEngine)
{
[gameEngine update];
nextUpdate = now + GAME_UPDATE_INTERVAL;
gameEngine.lastGameUpdateInterval = now - lastUpdate;
gameEngine.lastGameUpdateTime = now;
lastUpdate = now;
}
Run Code Online (Sandbox Code Playgroud)
但渲染线程仍然访问块之间-update的最后3行之间的gameEngine对象.为什么是这样?
ken*_*ytm 10
@synchronized不会阻止其他线程访问gameEngine.它只是@synchronized用同一个对象阻止其他对象.这意味着
// thread A:
@synchronized(a) {
do_A(a);
}
...
// thread B:
do_B(a);
Run Code Online (Sandbox Code Playgroud)
do_A并且do_B可以一起发生,但是在
// thread A:
@synchronized(a) {
do_A(a);
}
...
// thread B:
@syncrhonized(a) {
do_B(a);
}
Run Code Online (Sandbox Code Playgroud)
do_A和do_B将总是被顺序执行.