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

标签 c++ multithreading vector std

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

相关文章:

c++ - 当被调用方法使用调用者已经锁定的相同锁时,如何避免死锁?

php - PHP的线程与oracle错误: two-task save area overflow

c++ - 使用原子引用计数时是否需要保护删除资源?

c# - 这种异步/等待方法有什么问题?

c++ - 在 C++ 中打印 vector 数组

c++ - LevelDB:IO 错误:XXX.sst:打开的文件太多

c++ - Debug exec 工作正常但正常的一个段错误

c++ - STL迭代器重置

javascript - 在由不同颜色的立方体组成的网格中,如何找到匹配的簇?

c++ - 奇怪的 : vector<int> to int C++