这是我正在做的:
我正在接受贝塞尔点并运行贝塞尔插值,然后将结果存储在 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/