2015-03-13 23 views
-1

好吧,我有一個在不同的線程中不斷更新的結構。將數組(float)複製到本地數組(float)的最佳方法

現在我需要某些地方的這些變量在本地某個地方沒有他們之間的變化。

我第一次做到了讓他們在當地,這顯然不是最好的方法,但它的工作。

float MyFloatArray[3]; 
MyFloatArray[0] = otherThread()->floatArray[0]; 
MyFloatArray[1] = otherThread()->floatArray[1]; 
MyFloatArray[2] = otherThread()->floatArray[2]; 

現在我想知道是否有更好的方法來做到這一點。

我已經試過如下:

float MyFloatArray = otherThread()->floatArray; 
float* MyFloatArray = otherThread()->floatArray; //Works but updates the otherThread array(Obviously) but that shouldn't happen 

因爲我有一個體面的大項目這將是大量的工作,以更新所有這些以std::array<float,3>

有什麼選擇?否則,我會更新我所有的float數組到std::array<float,3>,因爲如果沒有其他選擇,它會更清晰。

+0

*由於我有一個體面的大項目,將更新所有這些''std :: array '*這並不真正顯示努力解決您的問題... – Walter 2015-03-13 16:16:51

+0

@Walter:And這並沒有顯示任何幫助它的努力 – 2015-03-13 16:18:19

+0

@LightnessRacesinOrbit正確,但我在他們的位置會做到這一點:更改'std :: array',即使這需要一點努力,它最終會付出代價。 – Walter 2015-03-13 16:36:18

回答

6

您可以簡單地撥打std::copy,確保副本受到同步機制(如mutex)的保護。例如:

std::mutex m; // otherThread() must lock this mutex when modifying array 

{ 
    std::lock_guard<std::mutex> lock(m); 
    std::copy(otherThread()->floatArray, otherThread()->floatArray + 3, MyLoatArray); 
} 

或使用可複製類型,如std::array<float, 3>並使用賦值。同樣,這必須通過同步機制來保護:

std::mutex m; // otherThread() must lock this mutex when modifying array 

{ 
    std::lock_guard<std::mutex> lock(m); 
    MyFloatArray = otherThread()->floatArray; 
} 
+0

但是,複製命令是一種正確的方法還是使用可複製類型,因爲我已經在我的答案中已經說得更好了?我被告知複製是一個相當不好的習慣/函數使用 – PrivateerGerrit 2015-03-13 15:52:27

+1

@PrivateerGerrit'std :: copy'是一個正確的方法,並沒有什麼錯。誰告訴你使用它是一個壞習慣應該解釋他們爲什麼這麼想。但我可能會使用'std :: array '而不是普通的C數組,給出選擇。 – juanchopanza 2015-03-13 15:54:47

+1

這個答案都沒有解決對象在另一個線程中同時發生變異的核心問題。 – 2015-03-13 16:14:30

2

您需要的是原子複製操作。不幸的是,整個結構並不存在,所以在複製操作期間,必須使用一個互斥鎖來鎖定對結構的訪問(並且在另一個線程中修改結構的持續時間)。

然後你可以堅持你的元素明智的任務,或切換到std::copy;它並不重要。從根本上來說,後者仍然要編譯爲元素明確的任務。無論您使用什麼語法,您的CPU仍然需要複製一系列字節,並且無法在單個原子操作中執行該操作。但只要您對結構的讀寫操作受到互斥鎖的保護,您就會好起來的。