gpt4 book ai didi

c++ - 终止 PPL 线程池中的线程

转载 作者:行者123 更新时间:2023-12-01 14:08:49 26 4
gpt4 key购买 nike

Microsoft 的 PPL 库包含强大的并行化概念,并使用线程池实现它们,因此在运行 PPL 任务时通常不会创建新线程。但是,似乎没有一种方法可以显式停止线程池中的线程。

我想明确停止线程的原因是因为 Qt。一些 Qt 方法将信息存储在分配的类实例中,指向此类实例的指针存储在线程本地存储中。只有在以优雅的方式停止线程时才会清除此内存。如果没有,Qt 就不能清理这个分配的内存。

将 PPL 与 Qt 结合使用意味着该内存在退出时没有适本地释放,这本身不是问题,但不幸的是,我们的内存分配库将这种未释放的内存报告为内存泄漏(请参阅 Is anyone using valgrind and Qt? 了解类似问题)。

我们注意到,如果我们自己创建线程(因此不使用 PPL 线程池),则不会报告任何泄漏。如果我们使用 PPL,则会报告泄漏。

所以,问题是:有没有办法显式停止 PPL 线程池中的线程?

最佳答案

PPL 在 C++ 中遵循与 C# 中的异步编程非常相似的概念。
一般的想法是“合作取消” - 您可以要求一个线程停止,该线程决定何时可以取消。
您不应该终止任务/线程,以免线程在未定义的指令处停止。
在这里,您可以看到如何使用 ppl 停止线程/任务的示例:

include <ppltasks.h>
#include <concrt.h>
#include <iostream>
#include <sstream>

using namespace concurrency;
using namespace std;

bool do_work()
{
// Simulate work.
wcout << L"Performing work..." << endl;
wait(250);
return true;
}

int wmain()
{
cancellation_token_source cts;
auto token = cts.get_token(); // <-- allow early cancellation, therefore share a cancellation_token

wcout << L"Creating task..." << endl;

// Create a task that performs work until it is canceled.
auto t = create_task([&]
{
bool moreToDo = true;
while (moreToDo)
{
// Check for cancellation.
if (token.is_canceled()) //<-- check for cancellation in the background thread
{
// Cancel the current task.
cancel_current_task(); //<-- informs the caller, "hey I got it..."
}
else
{
// Perform work.
moreToDo = do_work();
}
}
}, token);

// Wait for one second and then cancel the task.
wait(1000);

wcout << L"Canceling task..." << endl;
cts.cancel();

// Wait for the task to cancel.
wcout << L"Waiting for task to complete..." << endl;

t.wait(); //<-- this is import

wcout << L"Done." << endl;
}
但是为了帮助您更多-您可以向我们提供一些源代码吗?

关于c++ - 终止 PPL 线程池中的线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54467780/

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