gpt4 book ai didi

java - ConditionVariable 防止两个线程同时运行

转载 作者:行者123 更新时间:2023-11-29 21:41:34 25 4
gpt4 key购买 nike

出于游戏编程的目的,我试图在一对 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 会有这种效果?

最佳答案

Android 上的 Linux 内核试图避免在内核之间移动线程。如果一个线程“可运行”(即可以运行但正在等待另一个线程)一段时间,内核可以决定将它迁移到另一个内核。

如果在之前的实现中,您的一个线程倾向于连续运行,它可能使另一个线程处于“可运行”状态的时间足够长,导致内核迁移它。新的实现可能会以较小的步幅移动并低于阈值。

FWIW,其他人对此感到困惑,例如herehere .

关于java - ConditionVariable 防止两个线程同时运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16928461/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com