2015-08-03 74 views
0

在我的代碼中,我將數據保存在二進制文件中,當我保存時,我在不同的線程中運行功能save()。我保存的數據存儲在vector<uint_32>中,這個向量也被其他函數使用,我做了一個副本以避免衝突和不希望的修改,我認爲這不是解決此問題的最有效方法我想問問哪種方法是最好的方式?也許,我在想共享指針。 這裏是代碼:這是訪問多線程應用程序中共享對象的最佳方式嗎?

inline void write(std::vector<uint32_t > pData) { 
    fThread = std::thread(&FileHandler::writeFile, this, pData); 
    fThread.join(); 
} 
inline void writeFile(std::vector<uint32_t> cVectorCopy) { 
    fwrite((char*)&cVectorCopy[0] , cVectorCopy.size()*sizeof(uint32_t) , 1, fBinaryFile); 
    closeFile(); 
} 

回答

0

std::shared_ptr避免數據爭奪基礎數據的創建和破壞,而不是訪問。
關鍵資源(std::vector<uint_32>)需要使用std::mutex或無鎖工具進行保護。

+0

難道你不認爲互斥鎖或鎖定檢查比複製需要更多時間嗎?我的問題不是內存的使用,而是時間的使用。在這個鏡頭中,你認爲最好用像我這樣的副本來做嗎? – user3050386

+0

@ user3050386如果mootexes不適合你,你可以用[COW](http://stackoverflow.com/questions/628938/what-is-copy-on-write)嘗試:D - 但總的來說,您需要進行配置以瞭解優化是否有效。它太依賴於數據的大小和訪問模式,從理論上回答。 – Quentin

1

fThread = std::thread(&FileHandler::writeFile, this, pData); 
fThread.join(); 

沒有比這樣做

writeFile(pData); 

這是因爲join()是要阻止當前線程的執行,等到不同新創建的線程在允許當前線程繼續之前返回。

你可以調用detach()這將允許線程繼續並且數據將被寫入。

至於寫入矢量數據的最佳方式是什麼,取決於它將會變成什麼樣的大小以及你想要什麼樣的行爲。如果矢量不是那麼大,您可以複製一份,然後將副本寫入文件。如果矢量會很大,那麼我會建議使用std::lock_guard()或使用std::atomic類型。

與往常一樣,您應該進行配置以查看哪種方式實際上對您更快。

+0

這是絕對正確的,但不回答OP的問題,那就是如何在寫入時保護'std :: vector'不被修改。 – Quentin

0

要問的正確的問題是爲什麼您使用不同的線程進行保存。如果是因爲線程很好,就忘掉它並在主線程中進行保存。如果是因爲你的應用程序已經是多線程的,你將不得不用互斥體來保護對向量的訪問,以確保你讀取連貫的值。

如果您的數據不是太大,並且保存不凍結整個應用程序,只需持續保存互斥量即可。如果這是不可接受的(出於性能或用戶界面的原因),只有在將內存中的矢量複製到其他位置時才保持互斥體,釋放互斥鎖並異步寫入磁盤。

相關問題