2012-01-21 1 views
1

J'écris un composant en C qui sera utilisé par plusieurs processus différents accédant tous au même fichier.Quelle est la manière correcte d'utiliser CreateFileMapping et MapViewOfFile si j'ai l'intention d'accéder à plusieurs parties d'un fichier par plusieurs processus?

Chaque processus accédera à différentes parties du fichier en même temps, principalement pour la lecture mais aussi pour l'écriture.

J'essaie de savoir si la manière correcte est:

opition A: Pour chaque processus d'appeler CreateFileMapping une fois pour le fichier entier puis utilisez plusieurs fois MapViewOfFile sur des sections différentes pour accéder aux parties dont il a besoin , ce qui signifie que si j'ai 10 sections que je souhaite accéder j'appellerai CreateFileMapping une fois pour le fichier entier, bout à bout, puis MapViewOfFile 10 fois, une fois pour chaque partie du fichier.

OU

Option B: Pour chaque processus d'appel CreateFileMapping & MapViewOfFile sur chaque section spécifique, il souhaite accéder, ce qui signifie si j'ai 10 sections Je souhaite accéder que j'appellerai CreateFileMapping & MapViewOfFile chaque 10 fois.

Merci!

Répondre

3

Vous aurez certainement besoin d'appeler CreateFileMapping et MapViewOfFile au moins une fois par processus afin d'accéder aux données. Cependant, vous n'avez pas besoin de les appeler plus que cela une fois. Bien sûr, si le mappage est important, vous pouvez désimplanter et remapper pour enregistrer l'espace d'adressage virtuel, mais si la quantité de données n'est pas trop importante, vous pouvez ignorer cela.

Après avoir mappé votre mappage de fichier, votre processus voit les données directement. Les opérations de lecture et d'écriture se produisent instantanément et pour sérialiser l'accès et empêcher les conditions de course de thread, vous devez utiliser Interprocess Communication, comme les sémaphores.

Quelque chose que vous pourriez vouloir lire et étudier l'exemple de code: Shared Memory. Essayez également une recherche google pour MapViewOfFile + WaitForMultipleObjects pour plus d'informations.

+0

Cheers. J'ai compris dès le départ que chaque processus doit appeler bpth, ce que j'essaie de comprendre (et je ne comprends toujours pas) est de savoir si, dans le contexte d'un processus unique, je devrais CreateFileMapping sur l'ensemble du fichier (de bout en bout) puis utilisez MapViewOfFile pour afficher de petites portions du fichier, ou si je devrais utiliser CreateFileMapping plusieurs fois dans chaque processus - en mappant des portions plus petites au fur et à mesure. Je suppose que mon incompréhension de base est de savoir si elles devraient toutes deux être utilisées sur de petites portions du fichier, ou seulement sur MapView. –

+0

'CreateFileMapping' duplique les poignées vers le même objet noyau. Vous pouvez le faire plusieurs fois, mais pourquoi? Vous n'en avez pas besoin. Vous êtes d'accord pour l'appeler une fois pour la cartographie. Quant à 'MapViewOfFile', c'est à vous de décider si vous voulez mapper/démapper des parties ou le tout. Vous ne gaspillez pas de ressources autres que de consommer une quantité limitée d'espace d'adressage virtuel. Vous devrez peut-être penser à des portions si vous savez que le mappage peut être assez volumineux et que le traitement de données que vous faites suggère que vous n'avez pas besoin de parties aléatoires de la mémoire et que vous pouvez le faire de manière séquentielle. –

+0

Brillant, merci: D –

Questions connexes