在主页上的pharo海滨应用程序按钮上单击所有数据将保存在一个类名为Test.fl的燃料文件中。如果我在两个实例中一次调用同一个主页,则两个都调用以下代码来保存带有最新更新的Test.fl文件,
FLSerializer
serialize: self allObjects
toFileNamed: self name , '.fl'**
并获得例外:
CannotDeleteFileException:无法删除旧版本的文件...... \ Pharo3.0 \ Test.fl
我已经使用Mutex允许在第一个实例之后执行另一个实例,
mutexBlock := Mutex new.
mutexBlock critical: [
FLSerializer
serialize: self allObjects
toFileNamed: self name , '.fl' ]
但我仍然得到同样的错误
CannotDeleteFileException:无法删除旧版本的文件
请有人帮我解决这个错误。
答案 0 :(得分:5)
你的直觉可能是正确的:两个进程正在尝试同时写入(删除)同一个文件。但是,Mutex
方法不起作用,因为每次执行该代码时都会创建一个新的Mutex
。您必须将Mutex
存储在类或实例变量中(取决于代码的工作方式),以便每个进程都使用Mutex
的相同的实例。
您的代码看起来像这样:
MyClass class>>serializeProtect
^ SerializeProtect ifNil: [ SerializeProtect := Mutex new ]
self class serializeProtect critical: [
FLSerializer
serialize: self allObjects
toFileNamed: self name , '.fl' ]
注意:懒惰地初始化Mutex
通常不安全。我只是为了简单起见而在这里做。
答案 1 :(得分:0)
你不需要互斥锁。 Pharo过程中的海边一次请求一个。也就是说,这仅在您的文件写入速度很快时才有效,因为所有其他连接都等待写入完成。如果不是,您需要在单独的线程中进行写入,然后确实控制对它的访问