这是在多线程应用程序中访问共享对象的最佳方式
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();
}
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的访问,以确保你读到的是一致的值。
如果你的数据不是太大,并且保存不会冻结整个应用程序,只需在保存时一直保持互斥锁。如果这是不可接受的(出于性能或用户界面的原因),只保留互斥锁,同时将内存中的向量复制到另一个位置,释放互斥锁并异步写入磁盘。
相关文章:
- 复制包含C++所有元素的对象!(构造函数和赋值,最佳实践?
- 处理影响跨不同线程共享对象的定时回调的最佳方法是什么?
- 将FFMpeg AVFrame对象从C++应用程序流式传输到Python的最佳方法?
- 使用 gtest 框架在单元测试代码中检查目标对象的私有变量的最佳实践是什么?
- 保留计时器集合(对象与指针)的最佳方法
- 将(临时的?)std::string传递给使用它来构造一个接受副本的对象的函数的最佳方法是什么?
- 从类中的对象调用类中的函数的最佳方法
- 这是使用构造函数初始化数组对象的最佳方法吗?
- 在 c++ 中重置大型对象实例的最佳方法是什么
- 将对象附加到智能指针向量的最佳方法
- 将对象数组作为参数传递的最佳方法是什么
- 如何为对象提供不同的接口(最佳)
- 调用列表中子对象方法的最佳方法
- 哪种数据结构是在一个向量中搜索和计数对象对的最佳数据结构
- 找到多组对象的最佳匹配的算法
- C++拥有持久对象的最佳方式
- 动态创建新对象的最佳方法
- 用C++编写返回对象的函数的最佳方法是什么
- 两者之间的最佳方法是什么:实例化对象或使用指针
- 确定两个文件路径引用同一文件对象的最佳方法是什么