这是在多线程应用程序中访问共享对象的最佳方法?

时间:2015-08-03 13:10:22

标签: c++ multithreading

在我的代码中,我将数据保存在二进制文件中,当我保存时,我在另一个线程中运行函数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();
}

3 个答案:

答案 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)

要问的正确问题是为什么你使用不同的线程进行保存。如果是因为线程很好就忘了它并在主线程中进行保存。如果是因为您的应用已经是多线程的,则必须使用互斥锁保护对向量的访问,以确保您读取相干值。

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