2010-10-14 25 views
0

Si j'ai deux threads dans mon application Cocoa, et (disons), je lis le fichier X sur le disque avec un NSData +dataWithContentsOfFile:, et un autre thread est en train de mettre à jour ou de remplacer ce même fichier X , avec, par exemple, -writeToPath:atomically:? Je ne suis pas familier avec les modes de lecture/écriture des fichiers standard de Cocoa. L'opération de lecture peut-elle voir une corruption au milieu du fichier? Si oui, quelle est la manière standard autour de cela? Utilisez les fonctions POSIX pour autoriser efficacement les lecteurs multiples mais seulement un rédacteur exclusif?Quelle est la sémantique de threading pour les opérations de fichier Cocoa? par exemple. Méthodes de lecture/écriture NSData

Merci pour la perspicacité qui comble ma compréhension entre l'API Cocoa et le système de fichiers sous-jacent.

Répondre

1

L'opération de lecture peut-elle être endommagée au milieu du fichier?

Pas si vous définissez atomically à YES. Ce qui est écrit les données dans un fichier temporaire, puis écrase la destination prévue avec le fichier temporaire. C'est atomique (sur les systèmes de fichiers locaux, de toute façon) parce que c'est juste une modification rapide dans le répertoire.

La lecture peut n'obtenir qu'une partie des données si vous commencez immédiatement à écrire dans la destination voulue et que vous n'en avez pas fini, c'est-à-dire que vous avez passé atomically:NO. Donc, dans des cas comme celui-ci, ne faites pas cela-passez YES.

+0

Merci Peter. En ce qui concerne l'échange atomique: Que se passe-t-il si j'ai ouvert (disons) le fichier original pour le lire, mais je le lis toujours (soit parce qu'il est mappé en mémoire et que je prends mon temps ou en fait au milieu de la lecture) quand l'échange atomique se produit? Le système de fichiers garde-t-il l'ancienne copie sur disque alors qu'il y a des lecteurs pour cela? (Ou est-ce que le répertoire atomique change de bloc jusqu'à ce que les lecteurs soient fermés?) Cela semble peu probable.) –

+0

quixoto: L'ancien. Voir la page de manuel unlink (2), qui décrit ce qui se passe lorsqu'un fichier est supprimé (non lié). Cela devrait également être vrai d'un fichier qui n'est pas spécifiquement non lié mais qui est remplacé par un autre fichier, comme cela se produit dans une écriture atomique NSData. –

+0

Peter: Parfait. Exactement l'info que je cherchais. Merci pour la référence unlink. –