gpt4 book ai didi

c++ - 如何复制构造一个带有指向浮点 block 的指针的 std::vector 并将其传递给线程?

转载 作者:行者123 更新时间:2023-11-30 01:41:15 25 4
gpt4 key购买 nike

我需要按值将一组 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com