Я только начал изучать многопоточность в целом, и я знаю, что пример приложения - я работаю - может даже снизить производительность при использовании потоков. Использованный Компилятор 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 или событие как аргумент функции, но как решить эту проблему?
Постарайтесь очень тяжело, чтобы не создавать, прекращать и уничтожать потоки. Такие конструкции ошибочны, «менее оптимальны» из-за накладных расходов и склонны к ошибкам и блокировкам. Бенчмаркинг такой конструкции вводит в заблуждение. –