在不同的线程中调用向量析构函数或清除
Call vector destructor or clear in a different thread
我有 unique_ptr 的巨大矢量。
当我需要执行 clear() 或调用析构函数时,需要 4-5 秒。
加速它的一种理论上的方法是创建临时向量,将它与我工作的巨大向量交换,然后启动一个线程并在临时向量上调用清除。
在互联网上查看时,我没有看到有人像这样要求优化。
我的优化有问题吗?
我想你的想法应该可行。例如,如果您有一些名为 X
:
的数据的 std::vector
struct X
{
// some data here
};
using DataStorage = std::vector<std::unique_ptr<X>>;
您可以使用 std::async
移动 DataStorage
对象并异步调用此对象的 clear()
:
DataStorage data;
// data usage
auto clear_task = std::async(std::launch::async,
&DataStorage::clear, std::move(data));
// do some stuff here; data object is not used anymore
clear_task.wait();
这里没有不必要的复制:您只需移动 data
并指定要在单独的线程中调用 clear()
,这样主线程就不会在执行清除操作时挂起。
我有 unique_ptr 的巨大矢量。
当我需要执行 clear() 或调用析构函数时,需要 4-5 秒。
加速它的一种理论上的方法是创建临时向量,将它与我工作的巨大向量交换,然后启动一个线程并在临时向量上调用清除。
在互联网上查看时,我没有看到有人像这样要求优化。
我的优化有问题吗?
我想你的想法应该可行。例如,如果您有一些名为 X
:
std::vector
struct X
{
// some data here
};
using DataStorage = std::vector<std::unique_ptr<X>>;
您可以使用 std::async
移动 DataStorage
对象并异步调用此对象的 clear()
:
DataStorage data;
// data usage
auto clear_task = std::async(std::launch::async,
&DataStorage::clear, std::move(data));
// do some stuff here; data object is not used anymore
clear_task.wait();
这里没有不必要的复制:您只需移动 data
并指定要在单独的线程中调用 clear()
,这样主线程就不会在执行清除操作时挂起。