boost::interprocess内存映射文件的用法
2023年8月2日发(作者:)
boost::interprocess内存映射⽂件的⽤法⼀、闲聊 今天项⽬中要读写⼀个将近40M的⽂件,发现使⽤fstream读⽂件时,预先分配⼀个40M的缓冲区buffer时,随机性的会申请内存失败,因此查了下相关资料,发现使⽤内存映射⽂件可以解决此类读写⼤⽂件的问题。内存⽂件映射其实是内存中分配了⼀块区域映射到⽂件所在的物理磁盘上,内存和物理磁盘的数据交换是以页⼤⼩处理的,因此在操作过程中,不会将整个⽂件缓存到内存上,因此使⽤的内存特别的⼩,但对于程序员来说,映射的指针就如操作⼀块普通的内存⼀样⽅便,所有的页交换都由操作系统来处理了。⼆、代码测试boost::interprocess提供的⽂件映射类特别的简单,主要是file_mapping和mapped_region,具体的构造参数说明,可以去官⽹查看,这⾥只是提供⼀个例⼦。#include #include using namespace boost::interprocess;void main(){ file_mapping m_file("", read_write); mapped_region region(m_file, read_write); void * addr = _address(); std::size_t size = _size();}file_mapping类第⼀个参数是⽂件名,该⽂件必须存在,不然会抛出“找不到系统⽂件”的异常,它是不会帮你⾃动⽣成⽂件的。第⼆个参数是打开模式,⽬前只有read_only和read_write两种模式,⼀个是只读,⼀个是读写都可以。mapped_region类第⼀个参数是file_mapping的对象。第⼆个参数是打开模式,最好file_mapping的打开模式⼀致。get_address()就是取得⽂件的⾸地址了。get_size()是取得⽂件的长度。程序⾥为了保证⽂件操作的原⼦性,因此需要加锁,⽽boost也提供了这种⽂件锁的机制file_lock,其实它就是拿⼀个⽂件来当互斥量,那我们的代码就变成了这样。#include #include #include using namespace boost::interprocess;void main(){ file_lock f_lock(""); sharable_lock sh_lock(f_lock); file_mapping m_file("", read_write); mapped_region region(m_file, read_write); void * addr = _address(); std::size_t size = _size();}file_lock需要⼀个⽂件名的参数,如果该⽂件不存在也会抛异常,映射⽂件和锁⽂件可以是同⼀个。sharable_lock是共享锁,也可以使⽤独占锁scoped_lock,共享锁和独占锁的区别这⾥不细讲,可以问度娘。
发布者:admin,转转请注明出处:http://www.yc00.com/news/1690906879a460269.html
评论列表(0条)