iphone-文件系统如何响应同时访问同一文件?

iphone-文件系统如何响应同时访问同一文件?,iphone,Iphone,假设两个异步操作尝试读取或写入给定文件夹上的同一文件。iOS是如何处理的?操作是否排队?应用程序崩溃了?文件损坏了吗 如果由程序员来处理这个问题,我在哪里可以找到关于如何处理竞争条件、队列等的信息或示例 你们能给我一个提示吗 谢谢。我认为,当尝试获取文件的文件描述符时,如果它已经在使用中,则应该失败 由于显然无法知道文件是否已打开,因此可能有一种方法可以锁定文件 可帮助您的链接: 最有可能的答案是“文件损坏”。操作系统不会阻止多个线程同时写入一个文件,如果它们正在写入文件的重叠部分,则

假设两个异步操作尝试读取或写入给定文件夹上的同一文件。iOS是如何处理的?操作是否排队?应用程序崩溃了?文件损坏了吗

如果由程序员来处理这个问题,我在哪里可以找到关于如何处理竞争条件、队列等的信息或示例

你们能给我一个提示吗

谢谢。

我认为,当尝试获取文件的文件描述符时,如果它已经在使用中,则应该失败

由于显然无法知道文件是否已打开,因此可能有一种方法可以锁定文件

可帮助您的链接:

最有可能的答案是“文件损坏”。操作系统不会阻止多个线程同时写入一个文件,如果它们正在写入文件的重叠部分,则所有赌注都将被取消


因此,最好的办法是在访问文件时强制执行自己的排队。有很多方法可以做到这一点。在较低级别,您可以使用
NSLock
来防止同时访问,或者您可能希望使用调度队列。Julio的回答中提到的是一个很好的参考。

嗯,你认为“它应该失败”的依据是什么?因为我记不起来了,如果你可以打开一个文件的读写访问权限,而它已经被另一个程序打开了,我现在也无法尝试。现在,错误信息“无法打开文件…,文件可能正被其他程序使用”非常常见。因此,我非常确定,当您尝试在已打开的文件上获取文件描述符时,函数返回错误代码。是否要在后端处理函数,然后像我创建表一样执行此操作,并在后端电话中从webservice发送,当它在tableview上完成显示[NSThread detachNewThreadSelector:@selector]时执行此操作(loadImagesInBackground:)toTarget:self with Object:[NSNumber numberWithInt:indexPath.row]];@Julio抱歉,这不正确。NSFileHandles(或底层BSD文件描述符)不要包含任何自动内置写锁定;您可以愉快地打开同一文件的多个写描述符,而不会出现错误。为了完整性,在文件系统级别有一个可用的文件锁定机制,但(a)它要求您降到BSD级别(在
open()
上的O_exl标志),以及(b)它是一个“建议”锁定机制,因此只有在所有打开文件的地方都遵守规则的情况下才有效。请参阅,在您的程序中使用队列或NSLock是更好的解决方案(在iOS上,从其他进程访问是一个没有意义的问题,因为其他应用程序无论如何都无法进入您的沙盒)。