调用矢量析构函数或清除不同的线程

时间:2017-08-05 09:28:40

标签: c++ multithreading c++11 stdvector

我有很多unique_ptr的载体。

当我需要执行clear()或调用析构函数时,需要4-5秒。

加速它的一种理论方法是创建临时向量,将其与我工作的巨大向量交换,然后启动一个线程并在临时向量上调用clear。

在互联网上查看时,我没有看到有人说这样的优化。

我的优化中是否存在缺陷?

1 个答案:

答案 0 :(得分:1)

我猜你的想法应该有效。例如,如果您有std::vector个名为X的数据:

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(),以便在执行清除操作时主线程不会挂起。