【问题标题】:Passing arrays to thread将数组传递给线程
【发布时间】:2015-06-08 14:34:30
【问题描述】:

我正在尝试将多个数组传递给使用 std::thread 创建的线程,如下所示:

threadPool.push_back(std::thread(factor, Ap, Ai, Ax, b, Rs, Q, P, Pinv, n, 0, n, scale, nz));

函数因子定义如下:

void factor(int Ap[], int Ai[], double Ax[], double b[], double *Rs, int *Q, int *P, int *Pinv, int n, int k1, int k2, int scale, int nz);

线程已成功创建,我可以在 Visual Studio 线程窗口中看到它(来自调试器)。但是,线程中数组的数据与发送给线程的数据并不相似。 有人知道可能是什么原因吗?

【问题讨论】:

  • 听起来你传递了一个指针(本质上是一个数组参数),它指向一个函数作用域的数组,然后退出函数,因此数组超出了作用域并被销毁。跨度>
  • 是的,参数(Ap、Ai、Ax 和 b)最初定义为指针,然后作为数组传递给函数因子。您能否进一步解释您的上述评论。
  • 使用与stackoverflow.com/questions/4264304/…相同的解决方案

标签: arrays multithreading c++11 stdthread


【解决方案1】:

每当您将数据传递给线程时(对于指针类型的数据更是如此),您必须确保数据在线程处理数据时保持完整。


你看看你是否将一个(函数)本地数组传递给你的线程,但是调用者函数在你的线程访问你的变量之前完成,变量超出了它的范围并被释放,因此不能保证它会包含其原始值。非托管环境中的解决方案是保护您的调用例程在您的线程获取数据之前完成。此外,您的线程应该获得对您数据的所有权。

解决您的问题的最简单方法如下:

  1. 创建一个 (!!!volatile!!!) 布尔标志,取消设置 (=false) 并将其(通过引用)传递给您的线程。
  2. 在设置标志时阻止主线程的执行 (=true)。
  3. 在您的线程中复制您的数组,然后设置您的 (volatile) 标志 (=true)。

您可以使用其他synchronization objects 来等待您的线程获得对该对象的所有权。例如,如果您在 Windows 平台上,您可以创建一个 Event,将其传递给您的线程,然后 wait for it without an infinite loop 将权重放在您的处理器内核上。

【讨论】:

  • 有没有办法知道线程已经完成了数据的获取?
  • 您可以为此目的使用 volatile 变量或同步对象。
猜你喜欢
  • 1970-01-01
  • 2011-02-18
  • 1970-01-01
  • 2015-03-08
  • 2014-01-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多