簡體   English   中英

在多線程應用程序中訪問共享對象的最佳方法是哪種?

[英]which is the best way to access a shared object in a multithreading application?

在我的代碼中,我將數據保存在一個二進制文件中,當我保存時,我在另一個線程中運行函數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();
}

在做

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

沒什么不同

writeFile(pData);

這是因為join()將阻塞當前線程的執行,並等待新創建的線程返回,然后再允許當前線程繼續執行。

您可以調用detach() ,該方法將允許線程繼續執行並寫入數據。

至於寫入向量數據的最佳方法,取決於它的大小和所需的行為。 如果向量不那么大,您可以進行復制,然后將其復制到文件中。 如果向量很大,那么我建議使用std::lock_guard()或使用std :: atomic類型。

與往常一樣,您應該進行概要分析,以了解哪種方法實際上對您來說更快。

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

正確的問題是為什么您要使用不同的線程進行保存。 如果是因為線程很好,那就別管它了,然后保存到主線程中。 如果是因為您的應用程序已經是多線程的,則必須使用互斥對象保護對向量的訪問,以確保您讀取一致的值。

如果您的數據不是太大,並且保存不會凍結整個應用程序,則只需一直保持互斥即可進行保存。 如果這是不可接受的(出於性能或用戶界面的原因),則僅在將向量復制到內存中的另一位置時按住互斥鎖,釋放互斥鎖並異步寫入磁盤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM