需要设计一个全局变量,容纳std::fs:File类型的数据,因为需要可变(在初始化函数中由用户输入的路径文件名来做初始化),猜测应该使用类似lazy_static或者once_cell来变量声明。
在初始化函数中创建File对象。
但是问题来了,因为多个函数都需要(可变)引用这个对象(fs read数据);2个函数负责使用文件对象写数据。由于效率原因,不希望该对象对应的文件被频频打开和关闭,希望是初始化时就创建文件,之后文件句柄一直可用。
如何设计该对象的声明和初始化,和使用呢?
1
共 5 条评论, 1 页
评论区
写评论一个文件句柄要并发读写,不保护怎么行?rust 只是通过编译器强制你必须这么做而已。
这是doc里面的说法,读可以不用
&mut
(对某些系统),但写一定要&mut
所以大概 如果要求同时读写还是直接上锁更好一些Note that, although read and write methods require a &mut File, because of the interfaces for Read and Write, the holder of a &File can still modify the file, either through methods that take &File or by retrieving the underlying OS object and modifying the file that way. Additionally, many operating systems allow concurrent modification of files by different processes. Avoid assuming that holding a &File means that the file will not change.
OnceCell::sync::Lazy<RwLock>一把梭?
是的,read也需要&mut self...多谢纠正! 现在遇到的问题就是文件对象要如何设计来保存和使用。
对以下内容的回复:
首先读文件不能叫只读引用吧,标准库里的
read
函数也是要&mut self
的。其次,因为RAII,一般是drop
了那个文件对象之后才会关闭文件,所以不存在频繁打开关闭问题吧。