OVH Cloud OVH Cloud

Mutex partagé

5 réponses
Avatar
Grégory Schulz
Bonjour,

voila j'ai fait une expérience avec un mutex partagé entre deux PC

PC1 et PC2 sont en réseau

Main1.exe et Main2.exe sont identique, la seule différence est celle_ci :
#ifdef CLIENT1
fprintf(pFile,"Client 1 Valeur : %d \n",iValue) ;
#else
fprintf(pFile,"Client 2 Valeur : %d \n",iValue) ;
#endif

Main1.exe et Main2.exe créer un Mutex s'il n'est pas deja existant, puis
accèdent en lecture au fichier
setting.ini, ils y lise une valeur, qu'il vont incrémenter et écrire dans le
fichier setting, puis ils écrivent
dans le fichier Vérification une ligne du genre :

Client 1 Valeur : 15

cela signifie que le client 1 est venu lire la valeur 14 dans le fichier
setting, et l'a incrémenté.

Voici la config matériel :

sur PC1

Main1.exe
Main2.exe
Setting.txt
Verification.txt

sur PC2

un raccourcie de Main2.exe

je lance Main1 sur PC1
je lance Main2 sur PC2, mais il est exécuté dans l'environnement de PC1


et trés étrangement (mais heureusement rarement) j'obtiens ces choses la :

Client 2 Valeur : 49
Client 2 Valeur : 50
Client 2 Valeur : 52
Client 1 Valeur : 51 // le 52 est venu avant le 51 :)

lors d'un autre test :

Client 2 Valeur : 21
Client 2 Valeur : 22
Client 2 Valeur : 22 // L'utilisation de mutex est justement utilisée pour
éviter
Client 1 Valeur : 23 // ce genre de problème :)

quelq'un a t'il déjà utilisés les mutex partagés entre deux PC ?, a t-il
rencontré des problèmes similaire.
vous avez des idées pour résoudre mon ptit problème ? le source peut être
mis à dispo si quelqu'un le veux

@++

5 réponses

Avatar
Arnaud Debaene
Grégory Schulz wrote:
Bonjour,

voila j'ai fait une expérience avec un mutex partagé entre deux PC


Ca n'existe pas les mutexs partagés entre PC! In mutex est local a une
machine. Où as tu vu qu'il en était autrement?

PC1 et PC2 sont en réseau

Main1.exe et Main2.exe sont identique, la seule différence est
celle_ci : #ifdef CLIENT1
fprintf(pFile,"Client 1 Valeur : %d n",iValue) ;
#else
fprintf(pFile,"Client 2 Valeur : %d n",iValue) ;
#endif

Main1.exe et Main2.exe créer un Mutex s'il n'est pas deja existant,
puis accèdent en lecture au fichier
setting.ini, ils y lise une valeur, qu'il vont incrémenter et écrire
dans le fichier setting, puis ils écrivent
dans le fichier Vérification une ligne du genre :

Client 1 Valeur : 15

cela signifie que le client 1 est venu lire la valeur 14 dans le
fichier setting, et l'a incrémenté.

Voici la config matériel :

sur PC1

Main1.exe
Main2.exe
Setting.txt
Verification.txt

sur PC2

un raccourcie de Main2.exe

je lance Main1 sur PC1
je lance Main2 sur PC2, mais il est exécuté dans l'environnement de
PC1


Ca veut dire quoi "dans l'environnement de PC1"? Tel que tu le décris, Main2
s'exécute sur PC2 (PC1 sert juste de serveur de fichiers).

et trés étrangement (mais heureusement rarement) j'obtiens ces choses
la :

Client 2 Valeur : 49
Client 2 Valeur : 50
Client 2 Valeur : 52
Client 1 Valeur : 51 // le 52 est venu avant le 51 :)

lors d'un autre test :

Client 2 Valeur : 21
Client 2 Valeur : 22
Client 2 Valeur : 22 // L'utilisation de mutex est justement
utilisée pour éviter
Client 1 Valeur : 23 // ce genre de problème :)


En réalité, les 2 programmes accèdent de manière concurrente au fichier,
avec en plus tout le mécanisme de cache réseau qui entre en jeu (comment
sont ouverts les différents fichiers? En accès exclusif?)


quelq'un a t'il déjà utilisés les mutex partagés entre deux PC ?


Encore une fois, ca n'existe pas! Comment fais tu (ou penses tu faire) pour
ouvrir depuis PC2 un mutex existant sur PC1 ?

vous avez des idées pour résoudre mon ptit problème ?


C'est quoi le but réel? Accéder de manière non concurrente à un seul fichier
depuis plusieurs PC?

le source peut
être mis à dispo si quelqu'un le veux


Tu peux le poster ici.

Arnaud
Avatar
Patrick Philippot
Grégory Schulz wrote:
voila j'ai fait une expérience avec un mutex partagé entre deux PC



Comme Arnaud l'a dit, un mutex partagé en réseau, ça n'existe pas. Si
vous voulez éviter une écriture simultanée sur un fichier réseau depuis
plusieurs machines, utilisez simplement LockFileEx. Cette API asynchrone
a le gros avantage de permettre la mise en attente du thread appelant et
réclamant le lock jusqu'à ce que le lock soit accordé (en clair, jusqu'à
ce que l'autre code utilisateur ait libéré le lock) ou qu'une erreur se
produise. Si on y regarde bien, cela revient quasiment au même que si on
utilisait un mutex.

--
Patrick Philippot - Microsoft MVP [.Net]
MainSoft Consulting Services
www.mainsoft.xx
(remplacez .xx par .fr si vous répondez par e-mail)
Avatar
Grégory Schulz
Bonjour,

"Patrick Philippot" a écrit dans le message
de news: 40a1c8ea$0$8645$
Grégory Schulz wrote:
> voila j'ai fait une expérience avec un mutex partagé entre deux PC

Comme Arnaud l'a dit, un mutex partagé en réseau, ça n'existe pas. Si
vous voulez éviter une écriture simultanée sur un fichier réseau depuis
plusieurs machines, utilisez simplement LockFileEx. Cette API asynchrone
a le gros avantage de permettre la mise en attente du thread appelant et
réclamant le lock jusqu'à ce que le lock soit accordé (en clair, jusqu'à
ce que l'autre code utilisateur ait libéré le lock) ou qu'une erreur se
produise. Si on y regarde bien, cela revient quasiment au même que si on
utilisait un mutex.



okok :) ca n'existe pas :)

Merci pour cette API je vais essayer de faire un test avec, en effet ca
ressemble au mutex.

merci, bonne journé

--
Patrick Philippot - Microsoft MVP [.Net]
MainSoft Consulting Services
www.mainsoft.xx
(remplacez .xx par .fr si vous répondez par e-mail)





Avatar
GG
> okok :) ca n'existe pas :)



Mutex = MUTuel EXclusion

Comment peut-on partager un objet qui réalise une exclusion mutuelle ? ;-)

--
Cordialement.
GG.
Avatar
Vincent Guichard
GG a écrit :
okok :) ca n'existe pas :)




Mutex = MUTuel EXclusion

Comment peut-on partager un objet qui réalise une exclusion mutuelle ? ;-)



En le protégeant par un autre Mutex? ;-)

Vincent Guichard