我需要按值将一组 float 传递到线程中,这些 float 是第三方库返回的指针。像这样:
void TestThread(std::vector<float> data)
{
std::cout << data.size();
}
void Thready ()
{
vector<thread> threads(10); // this actually varies at runtime.
for (int i = 0; i < 10; i++)
{
float* data = HeapsOfFloats();
int numberOfFloats = NumberOfFloats();
std::vector<float> dataVector(data, data + numberOfFloats);
threads[i] = std::thread::thread([&]{TestThread(dataVector)});
}
for (int t = 0; t < 10; t++) threads[t].join();
}
循环 1-n 次迭代后,我的程序崩溃了。
最佳答案
编辑:您正在通过引用(对象)捕获 vector ,如果您幸运并且 lambda 中的函数调用已经复制了它,它将在您的循环迭代结束后被销毁 - 它有效,如果您不幸 - 有没有什么可复制的,你会崩溃。鉴于您确实无论如何都想使用一个拷贝,我建议通过复制到 lambda 中捕获它,然后通过 ref 传递它:
void TestThread(const std::vector<float>& data)
{
std::cout << data.size();
}
void Thready ()
{
vector<thread> threads(10); // this actually varies at runtime.
for (int i = 0; i < 10; i++)
{
float* data = HeapsOfFloats();
int numberOfFloats = NumberOfFloats();
std::vector<float> dataVector(data, data + numberOfFloats);
threads[i] = std::thread::thread([dataVector]{TestThread(dataVector)});
}
for (int t = 0; t < 10; t++) threads[t].join();
}
好处:你的代码(和我的)会产生两份 float 据拷贝,但如果你能用 C++14 编写,你至少可以少一份拷贝:
...
threads[i] = std::thread::thread([dataVector(std::move(dataVector))]{TestThread(dataVector)});
...
对于 C++14 之前的解决方案,请查看 here或者将你的 vector 包装在 smth 中,比如 shared_ptr 这样复制起来会更便宜
我不认为你抓取 float 的方式有什么问题(如果你产生了太多的线程)。
但是我认为您的问题出在其他地方:您在每次迭代时都在破坏线程,但是它们 have to be manually detached or joined为了避免终止,有时你很幸运,它们在你的循环周期结束之前运行到终止,有时 - 你不是。只需考虑 detach如果您不关心它们并且不打算稍后使用线程句柄,则在迭代结束时
关于c++ - 如何复制构造一个带有指向浮点 block 的指针的 std::vector 并将其传递给线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41644900/