[英]ConditionVariable prevents both threads from running simultaneously
我正在尝试出于游戏编程目的在一对Android线程之间强制执行同步。 我分配了一个游戏线程来处理大多数任务,并分配了一个渲染线程,负责交换缓冲区和渲染。 当我第一次询问线程同步时,我将ConditionVariable对象称为一种有用的工具,可以强制线程阻塞直到并发任务完成。
我的源代码如下所示:
...
final ConditionVariable bufferLock = new ConditionVariable();
final ConditionVariable cycleLock = new ConditionVariable();
bufferLock.open();
cycleLock.open();
Runnable bufferSwapTask = new Runnable()
{
public void run()
{
swapBuffers();
bufferLock.open();
}
};
Runnable renderTask = new Runnable()
{
public void run()
{
Log.d(TAG, "drawAll");
drawAll();
cycleLock.open();
}
};
while(!halt)
{
if(!init)
{
synchronized (userInputLock)
{
fetchUserInput();
}
processUserInput();
gameLogic();
bufferLock.block();
cycleLock.close();
renderThreadHandler.post(renderTask);
recycleDisplayObjects();
enqueueDisplayTree();
cycleLock.block();
bufferLock.close();
renderThreadHandler.post(bufferSwapTask);
}
}
...
因此,事情以正确的顺序执行,但没有达到我期望的性能水平。 而且,当我激活DDMS方法跟踪时,我发现DVM实际上会中断并阻塞每个线程以允许另一个线程继续进行,来回切换的方式强烈暗示两个线程仅由一个CPU处理。
使用ReentrantLocks的同时处理效果很好,为什么ConditionVariable会产生这种效果?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.