C++之并行开发

来源:互联网 发布:程序员专用昵称 编辑:程序博客网 时间:2024/06/04 22:02
*并行开发(加速游戏)
处理器制造商有用他们的cpu在每秒。这看起来是模型CPU在桌面电脑,台式以及手机,CPU将要超过2.5GHZ。CPU将要有yue来yue多的表现。在本章我们将要展示如何创造一个线程来执行这个方法Game::RunGame.这将要意味着主要的游戏循环将要运行在它自己本身的执行线程并且我们的主要功能是执行其他任务。现在展示如何创建一个游戏线程。
#include "GameLoop.h"
#include <thread>

void RunGameThread(Game &game)
{
    game.RunGame();
}

int main(int argc,_TCHAR* argv[])
{
    new SerializationManager();
    Game game;
    std::thread gameThread(RunGameThread,std::ref{game});
    assert(gameThread.joinable());
    while( !game.HashFinished() )
    {
        int x = 0;
    }
    gameThread.join();
    delete SerializationManager::GetSingletonPtr();
    return 0;
}

这段代码将要崩溃因为这个game::HasFinished方法将要重复被调用。他将要可持续性的在主线程和游戏线程之间将要获取变量在相同的时间里。
bool HasFinished() const
{
    return (m_playerQuit || m_playerWon);
}
游戏类将要尝试写这个m_playerWon变量在每次循环。甚至这个主线程将要尝试读这个m_playerWon变量在相同的时间里作为游戏线程来写它并且这个程序将要被关闭。你要处理
这些问题通过胡吃。c++提供这个mutex类来锁定这个多线程执行通过这个共享的变量。
std::mutex m_mutex;
std::unique_lock<std::mutex> m_finishedQueryLock{m_mutex,std::defer_lock};
我们有两个mutex,mutex他本身和unique_lock模板,他们将要提供方便的mutex方式。unique_lock构造函数构造一个Mutex对象作为主要参数。这个mutex行为。这个第二个参数是
可选择的;如果它没有被申请,那么unique_lock将要獲得一个锁早mutex立即的通过defer_lock我们能够表现出来。这个try_lock方式是lock非锁形式。这个方法将要返回true如果锁獲得或者如果锁不能獲得为false。现在你将要看到创建一个lock,我们能像你展示如何用这个unique_lock模板来防止你的Text造成崩溃。用这个lock将要保护这个m_playerQuit
以及m_playerWon变量在HasFinished方法中。
bool HasFinished() const
{
    m_finishedQueryLock.lock();
    bool hasFinished = m_playerQuit || m_playerWon;
    m_finisedQueryLock.unlock();
    return hasFinished;
}
HasFinished方法将要调用这个lock方法在m_finishedQuertLock它将要计算这个数值并且保存在hasFinished变量中。这个锁将要释放返回这个状态通过这个方式并且允许等待一个线程用来锁这个mutex。
这仅仅是第一步能够保护我们的程序避免崩溃。这个HasFinished方法调用这个主线程但是这个m_playerWon和m_playerQuit变量用来写这个game线程。我们来增加三个新的方法来保护这线程的变量。
void SetPlayerQuit()
{
    m_finishedQueryLock.lock();
    m_playerQuit = true;
    m_finishedQueryLock.unlock();
}

void SetPlayerWon()
{
    m_finishedQueryLock.lock();
    m_playerWon = true;
    m_finishedQueryLock.unlock();
}

bool GetPlayerWon()
{
    m_finishedQUeryLock.lock();
    bool playerWon = m_playerWon;
    m_finishedQueryLock.unlock();
    return playerWon;
}
这也以为着我们将要要求更新Game::onQuit方法来展示。
void Game::OnQuit()
{
    SerializationManager::GetSingleton.Save();
    SetPlayerQuit();
}
这个游戏Game::OnQuit方法现在调用这个SetPlayerQuit方法,用这个m_finishedQueryLock来保护这个变量。这个RunGame需要更新用这个SetPlayerWon以及GetPlayWon方法。

void Game::RunGame()
{
    InitializeRooms();
    const bool loaded = SerializationManager::GetSingleton().Load();
    WelcomePlayer(loaded);

    while(!HasFinished())
    {
        GivePlayerOptions();
         stringstream playerInputStream;
                GetPlayerInput(playerInputStream);

                EvaluateInput(playerInputStream);

                bool playerWon = true;
                for (auto& enemy : m_enemies)
                {
                        playerWon &= enemy->IsAlive() == false;
                }

                if (playerWon)
                {
                        SetPlayerWon();
                }
    }
         if (GetPlayerWon())
        {
                SerializationManager::GetSingleton().ClearSave();
                cout << "Congratulations, you rid the dungeon of monsters!"<< endl;
                cout << "Type goodbye to end" << endl;
                std::string input;
                cin >> input;
        }
}

0 0