在我的代码中,我将数据保存在二进制文件中,当我保存时,我在另一个线程中运行函数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 :(得分:1)
否则
fThread = std::thread( &FileHandler::writeFile, this, pData );
fThread.join();
与做
没什么不同writeFile(pData);
这是因为join()
将阻止当前线程的执行,并等待新创建的线程返回,然后才允许当前线程继续。
您可以调用detach()
,这将允许线程继续并且将写入数据。
就编写矢量数据的最佳方式而言,它取决于它的大小和您想要的行为。如果向量不是那么大,您可以复制,然后将副本写入文件。如果矢量很大,那么我建议使用std::lock_guard()
或使用std::atomic类型。
与往常一样,您应该了解哪种方式实际上更快。
答案 1 :(得分:0)
std::shared_ptr
避免数据争用,以便创建和销毁基础数据,而不是访问
关键资源(std::vector<uint_32>
)需要使用std::mutex
或无锁工具进行保护。
答案 2 :(得分:0)
要问的正确问题是为什么你使用不同的线程进行保存。如果是因为线程很好就忘了它并在主线程中进行保存。如果是因为您的应用已经是多线程的,则必须使用互斥锁保护对向量的访问,以确保您读取相干值。
如果您的数据不是太大而且保存没有冻结整个应用程序,只需按住互斥锁即可进行保存。如果这是不可接受的(出于性能或用户界面的原因),只有在将内存中的向量复制到其他位置时才保留互斥锁,释放互斥锁并异步写入磁盘。