Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何使用指向浮动块的指针复制构造std::vector并将其传递给线程?_C++_Multithreading_Vector_Std - Fatal编程技术网

C++ 如何使用指向浮动块的指针复制构造std::vector并将其传递给线程?

C++ 如何使用指向浮动块的指针复制构造std::vector并将其传递给线程?,c++,multithreading,vector,std,C++,Multithreading,Vector,Std,我需要通过值将第三方库返回的指针浮动块传递到线程中。大概是这样的: 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++) {

我需要通过值将第三方库返回的指针浮动块传递到线程中。大概是这样的:

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();
}
void TestThread(std::vector data)
{

std::coutEdit:您正在通过引用(到对象)捕获向量循环迭代结束后,这将被销毁,如果幸运的话,lambda内部的函数调用已经复制了它-它可以工作,如果不幸运的话-没有任何东西可以复制,你会崩溃。考虑到你想使用副本,我建议通过复制到lambda中,然后通过引用传递它:

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();
}
对于C++14之前的解决方案,请在smth中查看或包装您的向量,如共享\u ptr,这样复制成本更低


我不认为你抓取浮点数的方式有任何问题(如果你产生的线程太多的话)


但是我认为你的问题在别处:你在每次迭代中破坏线程,但是它们避免终止,有时你很幸运,它们在循环循环结束之前运行到终止,有时你不是。只考虑在迭代结束时,如果你不关心它们,也不打算在以后使用线程句柄

< P > Ed。it:您正在通过引用(到对象)捕获向量循环迭代结束后,这将被销毁,如果幸运的话,lambda内部的函数调用已经复制了它-它可以工作,如果不幸运的话-没有任何东西可以复制,你会崩溃。考虑到你想使用副本,我建议通过复制到lambda中,然后通过引用传递它:

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();
}
对于C++14之前的解决方案,请在smth中查看或包装您的向量,如共享\u ptr,这样复制成本更低


我不认为你抓取浮点数的方式有任何问题(如果你产生的线程太多的话)


<>但是我认为你的问题在别处:你在每次迭代中破坏线程,但是它们避免终止,有时你很幸运,它们在循环循环结束之前运行到终止,有时你不是。只考虑在迭代结束时,如果你不关心它们,也不打算以后使用线程句柄

或它。崩溃是因为你在滥发线程,因为浮点数不是整数类型,所以其中仍然隐藏着指针。这是怎么回事?除了Oleg关于通过引用lambda传递
dataVector
的非常真实的评论之外(考虑使用
[vec=std::move(dataVector)]{TestThread(vec)}
将数据干净地移动到闭包),从这里看一切都很好,我怀疑你的崩溃是在
HeapsOfFloats
NumberOfFloats
中的某个地方。我不理解你关于浮点数不是整数类型和指针的评论。整数意味着只有整数类型。不多也不少。浮点数也作为普通内存块存储。R在OP和comments中使用emoved integral引用。或者它崩溃是因为你在滥发线程,因为float不是整数类型,所以这里仍然隐藏着指针。这是怎么回事?除了Oleg关于通过引用lambda传递
dataVector
的非常真实的评论之外(考虑使用
[vec=std::move(dataVector)]{TestThread(vec)}
将数据干净地移动到闭包中),从这里看一切都很好,我怀疑你的崩溃是在
HeapsOfFloats
NumberOfFloats
中的某个地方。我不理解你关于浮点数不是整数类型和指针的评论。整数意味着只有整数类型。不多也不少。浮点数也作为普通内存块存储。R在OP和comments中删除完整引用。请参见编辑,其可能的帮助请参见编辑,其可能的帮助