2015-08-03 73 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

要问的正确的问题是为什么您使用不同的线程进行保存。如果是因为线程很好,就忘掉它并在主线程中进行保存。如果是因为你的应用程序已经是多线程的,你将不得不用互斥体来保护对向量的访问,以确保你读取连贯的值。

如果您的数据不是太大,并且保存不冻结整个应用程序,只需持续保存互斥量即可。如果这是不可接受的(出于性能或用户界面的原因),只有在将内存中的矢量复制到其他位置时才保持互斥体,释放互斥锁并异步写入磁盘。

相关问题