1

私は一般的にマルチスレッドを学び始めたばかりで、サンプルアプリケーション(私が取り組んでいる)はスレッドを使用するとパフォーマンスが低下する可能性があることを知っています。使用されるコンパイラはGCC4.7で、次のフラグ があります。-std = c ++ 0x -g -O3 -Wall

したがって、私はC ++ 11で作業しており、std::thread実装を使用しています。一般的に、私はクロスプラットフォームを開発しようとしているので、GCC4.7も使用し、自宅のマシンでUbuntu / Mac OSXを使用して、UniversityComputers上のWindowsで開発しています。ウィンドウ作成のクロスプラットフォームを処理できるようにするために、SFMLライブラリ(2.0)を使用します。

ここでは、簡略化されたCAppクラスと関連する関数を示します。

class CApp
{
public:
    //! Constructor.
    CApp(void);
    //! Deconstructor.
    ~CApp(void);

    /* Public Functions: */
    //! Initializer function, needs to be called before Run-Function to allocate everything and set everything up.
    bool Initialize(unsigned int width, unsigned int height, char* title, bool vsync, CState* startState);
    void Run(void); //!< Starts the game-loop
private:
    void ProcessEvent(sf::Event event);

    sf::RenderWindow*   m_pWindow;      //!< window instance
    std::vector<std::thread> m_threads;
};

一般に、私のアプリケーションは小さなOpenGLデモシーンであり、マルチスレッドが適している場所とそうでない場所をベンチマークして比較できるように、高度にマルチスレッド化する必要があります。

関連する機能の実装:

void CApp::Run(void)
{
    while (m_pWindow->IsOpen())
    {
        sf::Event event;
        while (m_pWindow->PollEvent(event))
        {
            m_threads.push_back(std::thread(&CApp::ProcessEvent, this, event)); 
        } 
        // ...
        m_threads.clear();
    }
}

void CApp::ProcessEvent(sf::Event event)
{
    if (event.Type == sf::Event::Closed)
        m_pWindow->Close();
    if (event.Type == sf::Event::KeyPressed) 
    {
        if (event.Key.Code == sf::Keyboard::Escape)
            m_pWindow->Close();
    }
}

私が得るランタイムエラーは単に中止トラップです:最初のフレームで6:_ "アクティブな例外なしで呼び出された終了-プログラムはシグナルSIGABRTを受信しました、中止されました。0x00007fff8fdf4ce2in __pthread_kill()" _

スレッドの作成を推奨せず、現在のスレッドでProcessEventを呼び出すだけでは問題は発生しないため、問題はスレッドに関連している必要があります。

SFMLはすべてスレッドセーフではないため、問題はm_pWindow-Pointerまたは関数の引数としてのイベントであると思いますが、この問題を解決するにはどうすればよいですか?

4

1 に答える 1

3

ベクトルをクリアしてすべてのスレッドを削除する前に、すべてのスレッドが終了するのを確実に待つ必要があります。

void CApp::Run(void)
{
    while (m_pWindow->IsOpen())
    {
        sf::Event event;
        while (m_pWindow->PollEvent(event))
        {
            m_threads.push_back(std::thread(&CApp::ProcessEvent, this, event)); 
        } 

    for(auto& i : m_threads)
      i.join();

    m_threads.clear();
   }
}

さらに、GCCを使用している場合は、-pthreadオプションを使用してコンパイルすることをお勧めします。

于 2012-04-19T11:32:15.943 に答える