gpt4 book ai didi

c++ - 并发事件处理问题

转载 作者:行者123 更新时间:2023-11-30 03:02:20 25 4
gpt4 key购买 nike

我刚刚开始学习多线程,我知道我正在开发的示例应用程序在使用线程时甚至可能会降低性能。使用的编译器是 GCC4.7,带有以下标志:-std=c++0x -g -O3 -Wall

因此我正在使用 C++11 并使用 std::thread 实现。一般来说,我尝试开发跨平台,所以我在大学计算机上使用 GCC4.7 在 Windows 上开发,在我的家用机器上使用 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 演示场景,它应该是大量多线程的,以便能够进行基准测试和比较适合多线程和不适合多线程的地方。

相关功能的实现:

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();
}
}

我得到的运行时错误只是一个 Abort trap: 6 在第一帧:_"终止调用而没有事件异常 - 程序接收到信号 SIGABRT,已中止。__pthread_kill () 中的 0x00007fff8fdf4ce2"_

如果我取消线程创建并在当前线程中调用 ProcessEvent,则不会出现任何问题,因此问题一定与线程相关。

SFML 并不是所有线程安全的,所以我假设问题是 m_pWindow-Pointer 或事件作为函数参数本身,但我该如何解决这个问题?

最佳答案

在清除 vector 并删除所有线程之前,您一定要等待所有线程完成:

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 选项进行编译。

关于c++ - 并发事件处理问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10226716/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com