簡體   English   中英

ConditionVariable防止兩個線程同時運行

[英]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會產生這種效果?

Android上的Linux內核試圖避免在內核之間移動線程。 如果某個線程“可運行”(即可以運行但正在等待另一個線程)一段時間,則內核可以決定將其遷移到另一個內核。

如果在以前的實現中,您的一個線程趨向於連續運行,則它可能已將另一個線程保持在“可運行”狀態的時間足夠長,足以導致內核對其進行遷移。 新的實現可能會以較小的步伐移動並低於閾值。

FWIW,其他人對此感到困惑,例如在這里這里

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM