将数组传递给线程

时间:2015-04-03 13:36:08

标签: arrays multithreading c++11 stdthread

我正在尝试将多个数组传递给使用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线程窗口(来自调试器)中看到它。但是,线程中数组的数据与发送到线程的数据不相似。 任何人都知道可能是什么原因?

1 个答案:

答案 0 :(得分:1)

每当您将数据传递给线程时(对于指针类型数据来说更为真实),您必须确保在线程处理数据时数据保持不变。


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

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

  1. 创建一个(!!! volatile !!!)布尔标志,取消设置(= false)并将其(通过引用)传递给您的线程。
  2. 在标志设置(= true)时阻止主线程的执行。
  3. 在您的线程中复制数组,然后设置(volatile)标志(= true)。
  4. 您可以使用其他synchronization objects等待您的线程获取对象的所有权。例如,如果您使用的是Windows平台,则可以创建Event,将其传递给您的主题并wait for it without an infinite loop将重要性放在处理器核心上。