【发布时间】:2020-03-25 16:17:18
【问题描述】:
我有一个必须在 Windows 中运行的 C++ 程序。
我有一个游戏,在函数WinMain 中有一个主循环,它在每次迭代中调用Update 函数。我想将多线程应用到更新函数的循环中。
int __stdcall WinMain()
{
// Windows initializations
// Main loop
{
Game game = new Game();
bool bExit = false;
while (!bExit)
{
MSG msg;
while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
if (msg.message == WM_QUIT) bExit = true;
TranslateMessage(&msg);
DispatchMessage(&msg);
}
game->Update();
}
delete game;
game = nullptr;
}
// Windows destructions
return 0;
}
// Game.cpp
void Game::Update() {
// Loop that I want to be parallelized but I don't want to create the thread pool here because it's called on every frame
for (size_t i = 0; i < entities.size(); i++) {
entities[i]->Update();
}
}
我尝试使用 OpenMP,但我无法将 #pragma omp parallel 放在 WinMain 函数中(应用程序会崩溃),如果我在循环之前将 #pragma omp parallel for 放在 Game::Update 中,它实际上会降低性能,因为它在每一帧中创建线程循环。
我正在寻找一种基于库的解决方案,或者最好是本机解决方案,它可以让我轻松地并行化这个循环。
唯一的要求是它可以在 Windows 中运行,我宁愿不使用库(比如 boost,虽然 OpenMP 很好)。
编辑:我让它与 PPL 的 concurrency::parallel_for 一起工作。它不会降低性能,但也不会提高性能...我对此的问题是:此函数是否在每次调用时创建和销毁其线程池?
【问题讨论】:
-
你看过原生的 Windows 线程池吗?
-
@ZuodianHu 线程管理的抽象是首选,因为我没有Windows线程API的经验,我今天需要做这个项目。
-
我知道你说 boost 不是首选,但它在 Boost.Asio 中有一个非常简单的仅标头线程池。 Boost.Asio 还允许您使用 io_context 轻松编写自己的池。除此之外,我不知道任何不需要您编写自己的线程安全队列的快速非库解决方案
-
@ZuodianHu 只是因为Boost需要安装和学习库。如果你能详细说明一个简单的例子,那么我可能会尝试一下。
-
@ZuodianHu 谢谢你的例子。我尝试了一个简单的
concurrency::parallel_for,它成功了。但是我仍然不知道为它创建的线程池在哪里。
标签: c++ windows multithreading