c++ - 将多个 std::vectors 复制到 1 中的更好方法? (多线程)

标签 c++ multithreading vector

这是我正在做的:

我正在接受贝塞尔点并运行贝塞尔插值,然后将结果存储在 std::vector<std::vector<POINT>.

贝塞尔曲线计算拖慢了我的速度,所以这就是我所做的。

我从 std::vector<USERPOINT> 开始这是一个带有一个点和 2 个其他点的结构,用于贝塞尔曲线图柄。

我将它们分成大约 4 组,并分配每个线程完成 1/4 的工作。为此,我创建了 4 std::vector<std::vector<POINT> >存储每个线程的结果。最后所有点都必须在 1 个连续 vector 中,在我使用多线程之前我直接访问它但现在我保留线程产生的 4 个 vector 的大小并将它们插入到原始 vector 中 vector ,以正确的顺序。这可行,但不幸的是复制部分非常慢并且比没有多线程时慢。所以现在我的新瓶颈是将结果复制到 vector 中。我怎样才能更有效地做到这一点?

谢谢

最佳答案

让所有线程像以前一样将它们的结果放入一个连续的 vector 中。您必须确保每个线程只访问 vector 中与其他线程分开的部分。只要是这种情况(无论如何都应该——你不想两次生成相同的输出)每个人仍在使用与其他人分开的内存,你不需要任何锁定(等)让事情正常进行。但是,您确实需要/想要首先确保结果的 vector 对于所有结果具有正确的大小——多个线程尝试(例如)调用 resize()push_back() vector 在匆忙中造成严重破坏(更不用说导致复制,你显然想在这里避免)。

编辑:正如 Billy O'Neal 所指出的,执行此操作的通常方法是将指针传递到 vector 的每个部分,每个线程将在其中存放其输出。为了争论起见,假设我们使用的是 std::vector<std::vector<POINT> >提到作为原始版本的东西。目前,我将跳过创建线程的细节(特别是因为它因系统而异)。为简单起见,我还假设要生成的曲线数恰好是线程数的倍数——实际上,曲线不会完全平均分配,因此您必须“捏造”算作一个线程,但这实际上与手头的问题无关。

std::vector<USERPOINT> inputs; // input data   
std::vector<std::vector<POINT> > outputs; // space for output data

const int thread_count = 4;

struct work_packet {           // describe the work for one thread
    USERPOINT *inputs;         // where to get its input
    std::vector<POINT> *outputs;   // where to put its output
    int num_points;                // how many points to process
    HANDLE finished;               // signal when it's done.
};

std::vector<work_packet> packets(thread_count); // storage for the packets.
std::vector<HANDLE> events(thread_count);       // storage for parent's handle to events

outputs.resize(inputs.size);                    // can't resize output after processing starts.

for (int i=0; i<thread_count; i++) {
    int offset = i * inputs.size() / thread_count;
    packets[i].inputs = &inputs[0]+offset;
    packets[i].outputs = &outputs[0]+offset;
    packets[i].count = inputs.size()/thread_count;
    events[i] = packets[i].done = CreateEvent();

    threads[i].process(&packets[i]);
}


// wait for curves to be generated (Win32 style, for the moment).
WaitForMultipleObjects(&events[0], thread_count, WAIT_ALL, INFINITE);

请注意,尽管我们必须确定 outputs vector 在被多个线程操作时不会调整大小,in 输出中的点的各个 vector 可以是,因为每个点只会被一个线程同时触及时间。

关于c++ - 将多个 std::vectors 复制到 1 中的更好方法? (多线程),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3191727/

相关文章:

C# 与多线程共享锁

Scala Actor : receive vs react

android - 同时运行多个 AsyncTask —— 不可能吗?

c++ - 旋转 vector (数组)

matlab:将向量分成固定大小的重叠 block

c++ - 为什么 sqrt() 在没有为 int 定义的 int 变量上工作正常?

c++ - 我自己的 COM 组件上未注册类 (0x80040154)

c++ - 输入和输出迭代器

c++ - 当我使用 expect 运算符时,我会使用 spirit X3 获得更快的解析器吗

c++ - std::vector 不是异常安全的?