将数组传递给线程

Passing arrays to thread

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

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


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

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

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

您可以使用其他 synchronization objects to wait for your thread to obtain ownership over the object. If you are on Windows platform for example, you can create an Event, pass it to your thread and wait for it without an infinite loop 来加重您的处理器内核。