2015-04-03 50 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