2015-04-03 41 views
1

我想多个阵列传递到正在使用的std ::线程如下创建的线程:传递数组线程

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

听起来就像你传递了一个指向函数作用域数组的指针(实质上是一个数组参数),然后退出该函数,以便数组超出范围并被销毁。 – Sneftel 2015-04-03 13:38:34

+0

是的,参数(Ap,Ai,Ax和b)最初定义为指针,然后作为数组传递给函数因子。你能否请进一步解释你的上述评论。 – Anas 2015-04-03 13:42:21

+0

使用相同的解决方案http://stackoverflow.com/questions/4264304/how-to-return-an-array-from-a-method – Sneftel 2015-04-03 13:43:24

回答

1

无论何时将数据传递给线程(对于指针类型化数据而言,这种情况都非常严重),必须确保数据在线程正在工作时保持不变。


你看,如果你传递一个(功能)本地阵列到你的线程,但你的线程访问的变量之前调用函数结束时,变量用完它的范围,并得到释放,因此难保它将包含其原始值。非托管环境中的解决方案是保护您的调用例程在线程获取数据之前完成。你的线程也应该获得你的数据的所有权。

您的问题最简单的办法是:

  1. 创建(!!!​​!!!)布尔标志,未设置它(= FALSE),并通过它(参考)到你的线程。
  2. 在标志设置(= true)时阻止主线程的执行。
  3. 在线程中创建数组的副本,然后设置您的(易失性)标志(= true)。

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

+0

有没有办法知道线程已完成获取数据? – Anas 2015-04-03 14:50:48

+1

您可以为此使用易失性变量或同步对象。 – mg30rg 2015-04-06 22:31:30