【问题标题】:iphone - how the file system responds to accessing the same file at the same time?iphone - 文件系统如何响应同时访问同一个文件?
【发布时间】:2010-11-26 03:53:01
【问题描述】:

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

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

你们能给我一个提示吗?

谢谢。

【问题讨论】:

    标签: iphone


    【解决方案1】:

    【讨论】:

    • 呃,你认为“它应该失败”的依据是什么?
    • 因为我不记得现在不能尝试是否可以打开对另一个程序已经存在的文件的读写访问权限。并且出现错误消息“无法打开文件......,该文件可能正在被另一个程序使用”现在很常见。所以我很确定,当您尝试获取已打开文件的文件描述符时,该函数会返回错误代码。
    • 你想在后端处理函数然后像我创建表一样在后端电话来自webservice,当它完成在tableview上显示时[NSThread detachNewThreadSelector:@selector(loadImagesInBackground:) toTarget: self withObject:[NSNumber numberWithInt:indexPath.row]];
    • @Julio 抱歉,这不正确。 NSFileHandles(或底层 BSD 文件描述符)不包括任何自动内置的写锁定;您可以愉快地打开多个写入描述符到同一个文件而不会出错。
    • 为了完整性:文件系统级别的文件锁定机制,但是 (a) 它需要您降到 BSD 级别(@987654328 上的 O_EXCL 标志@) 和 (b) 它是一种“建议”锁定机制,因此它仅在所有打开文件的地方都按规则播放时才有效。请参阅stackoverflow.com/questions/1337761/… 在您的程序中使用队列或 NSLock 是一个更好的解决方案(从其他进程访问在 iOS 上是一个有争议的问题,因为其他应用程序无论如何都无法进入您的沙箱)。
    【解决方案2】:

    最可能的答案是“文件已损坏”。操作系统不会做任何事情来阻止多个线程同时写入文件,如果它们正在写入文件的重叠部分,那么所有的赌注都没有了。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-03
      • 2015-01-06
      • 1970-01-01
      • 2022-10-25
      • 2022-09-24
      • 1970-01-01
      相关资源
      最近更新 更多