2012-04-19 4 views
1

Я только начал изучать многопоточность в целом, и я знаю, что пример приложения - я работаю - может даже снизить производительность при использовании потоков. Использованный Компилятор GCC4.7 со следующими флагами: -std = C++ 0x -g -O3 -WallПроблемы с одновременной обработкой событий

Поэтому я работаю с C++ 11 и использовать зЬй :: реализации потоков , В общем, я стараюсь развивать кросс-платформу, поэтому я разрабатываю Windows на университетских компьютерах, используя GCC4.7, а также Ubuntu/Mac OSX на своей домашней машине. Чтобы иметь возможность обрабатывать кросс-платформу для создания окон, я использую 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 Demo Scene, которая должна быть сильно многопоточный, чтобы иметь возможность для сравнения и сравнить, где многопоточности подходит, а где нет.

Реализации соответствующих функций:

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 на первом кадре: _ "Terminate вызывается без активного исключения - Программа получила сигнал SIGABRT, Прервано 0x00007fff8fdf4ce2 в __pthread_kill() "_

Если я наружу создание потока и просто вызову ProcessEvent в текущем потоке, проблем не возникает, поэтому проблема должна быть связана с потоком.

SFML не во всех поточно-безопасных, поэтому я предполагаю, что проблема заключается в том, что m_pWindow-Pointer или событие как аргумент функции, но как решить эту проблему?

+0

Постарайтесь очень тяжело, чтобы не создавать, прекращать и уничтожать потоки. Такие конструкции ошибочны, «менее оптимальны» из-за накладных расходов и склонны к ошибкам и блокировкам. Бенчмаркинг такой конструкции вводит в заблуждение. –

ответ

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.

+0

не могу поверить, что я забыл простую вещь ... большое спасибо! – niktehpui

Смежные вопросы