2013-04-13 1 views
1

Bonjour les utilisateurs de StackOverflow.

J'ai travaillé avec le MapViewOfFile de l'API Win32 en C++, je suis un débutant, mais j'ai essayé de créer un sémaphore pour un fichier mapview, donc une instance ne peut pas copier à moins que le l'autre instance l'a déjà copiée et l'instance principale l'a lue. L'idée que j'ai eu était de créer différentes méthodes pour le faire, mais j'ai besoin de savoir la meilleure façon de le faire.

1) Utilisation de la boucle while pour attendre la mapviewfile être vide.
J'ai essayé de faire ce qui suit:
Meilleure méthode pour un sémaphore dans un MapViewOfFile - C++

mapViewFile = (LPTSTR) MapViewOfFile(mapView, 
FILE_MAP_ALL_ACCESS,0,0,SH_MAX_MEMORY); 

if(mapViewFile!=NULL){ 

// Wait for the mapviewfile to be empty. 
while(mapViewFile!=""); // This while is only for delay the operation and wait for the mapviewfile it's empty, we don't need any action in this while. 
CopyMemory((PVOID)mapViewFile,defaultalloc,(_tcslen(defaultalloc) * sizeof(TCHAR))); 
UnmapViewOfFile(mapViewFile); 
} 

CloseHandle(mapView); 

Ainsi, lorsque le mapviewfile il est vide, le tout se sautée et les copies exemple « secondaire » dans, puis l'instance principale lit et vider le mapviewfile, Cela génère un sémaphore.

2) L'utilisation d'un mutex
L'autre façon, il est d'utiliser le mutex de l'API Win32 avec le CreateMutex
Je n'ai pas travaillé avec encore, mais je pense que je peux faire avec ce que je vouloir faire.


Alors, Mes questions sont les suivantes:

  1. Quelle façon dont il est le meilleur de faire ce que je veux faire? (Expliqué dans le paragraphe 1)
  2. Un mapviewfile n'est pas problématique en faisant cela? (Rappelez-vous que je veux communiquer deux instances ou plus avec une instance principale).

Ce sont les questions, merci.

Répondre

1

Vous cherchez à synchroniser l'accès à une ressource partagée. La façon de faire est d'utiliser un objet de synchronisation. Ce qui signifie d'utiliser un mutex.

L'utilisation d'un mutex signifie que vous pouvez le faire attendre au repos plutôt que d'une boucle d'attente. Et vous n'avez pas non plus besoin de vous soucier du compilateur optimisant la lecture de mapViewFile dans la boucle while. Et si vous avez plusieurs processus d'écriture, alors vous avez une course de données que vous ne pouvez pas résoudre sans un mutex ou équivalent. Votre première option ne peut jamais fonctionner dans ce scénario. Par ailleurs, vous devez utiliser strcmp dans le test de boucle while. C'est parce que mapViewFile!="" évalue toujours vrai.

+0

Ce sera un bon moyen, j'ai essayé de travailler avec elle ... Je ne sais pas si vous pouvez mettre un exemple. L'instance principale devrait avoir accès à ce mutex, quel qu'il soit, s'il est verrouillé ou déverrouillé. Par exemple, l'instance # 2 copie l'information et finit de copier l'information, mais l'instance principale ne l'a pas encore lue, ainsi le # 3 ne peut copier l'information que si l'instance principale l'a lu. Ce que j'ai à l'esprit, c'est que le # 2 verrouille le mutex et que l'instance principale le déverrouille, ai-je tort? – Spamdark

+1

Eh bien, c'est une question différente. Et pour être honnête, ce n'est pas approprié pour Stack Overflow. Il existe déjà des millions d'exemples d'utilisation d'un mutex.Trouvez-en un, avec un websearch, essayez-le, et si vous avez des problèmes spécifiques, alors cela peut être une autre question. –

+0

Merci, eh bien, ce que je voulais avec cette question, c'est de savoir quel était le meilleur moyen, et il est maintenant répondu. Je continuerai à chercher et je modifierai la question avec la solution. – Spamdark

Questions connexes