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

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

本文关键字:对象 最佳 方式 访问共享 多线程 应用程序      更新时间:2023-10-16

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

Doing

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

没有区别
writeFile(pData);

这是因为join()将阻止当前线程的执行,直到新创建的线程返回,才允许当前线程继续执行。

你可以调用detach(),这将允许线程继续,数据将被写入。

至于写vector的数据的最好方法是什么,这取决于它的大小和你想要的行为。如果向量不是那么大,可以进行复制,然后将副本写入文件。如果vector要很大,那么我建议使用std::lock_guard()或std::原子类型。

像往常一样,你应该分析一下哪条路对你来说更快。

std::shared_ptr避免底层数据的创建和销毁,而不是访问。
关键资源(std::vector<uint_32>)需要使用std::mutex或lockfree工具进行保护。

正确的问题是为什么使用不同的线程进行保存。如果是因为线程很好,那就忘掉它,在主线程中进行保存。如果这是因为你的应用已经是多线程的,你就必须用互斥锁来保护对vector的访问,以确保你读到的是一致的值。

如果你的数据不是太大,并且保存不会冻结整个应用程序,只需在保存时一直保持互斥锁。如果这是不可接受的(出于性能或用户界面的原因),只保留互斥锁,同时将内存中的向量复制到另一个位置,释放互斥锁并异步写入磁盘。