Sémaphore/Données critiques en C sous Windows

Sémaphore/Données critiques en C sous Windows - Programmation

Marsh Posté le 28-05-2002 à 09:30:13    

Comment qu'on fait ?
 
Je ne trouve pas d'équivalent à sema_post / sema_wait dans la MDSN.
Je ne trouve que des classes. Mais je travaille en C et non en C++.
Il me faut protéger l'accès à un fichier des accès multiples par différents threads.
Comment faire ?

Reply

Marsh Posté le 28-05-2002 à 09:30:13   

Reply

Marsh Posté le 28-05-2002 à 09:37:16    

utilise les mutex.

Reply

Marsh Posté le 28-05-2002 à 09:39:48    

C'est les sémaphores, non ?
 
Sinon, tu peux expliquer ?

Reply

Marsh Posté le 28-05-2002 à 09:46:09    

Mog a écrit a écrit :

Comment qu'on fait ?
 
Je ne trouve pas d'équivalent à sema_post / sema_wait dans la MDSN.
Je ne trouve que des classes. Mais je travaille en C et non en C++.
Il me faut protéger l'accès à un fichier des accès multiples par différents threads.
Comment faire ?  




 
Tu peux utiliser les Mutex.
Pour ça tu fais

Code :
  1. HANDLE hMutex;


A l'entrée dans le Tread principal, tu fais

Code :
  1. hMutex = CreateMutex(NULL,FALSE,NULL);// à voir pour les paramètres


 
Ensuite, quand tu veux garantir un accès unique, tu fais un appel à cette fonction:

Code :
  1. BOOL enter_single_thread(HANDLE hMutex)
  2. {
  3. BOOL bResult=FALSE;
  4. if (hMutex!=NULL)
  5. {
  6.  long lgReponse;
  7.  long inc=12; // max wait  
  8.  do {
  9.   rep=WaitForSingleObject(hMutex,60000); // wait 1 s
  10.   inc --;
  11.  } while (lgReponse != WAIT_OBJECT_0 && inc > 0);
  12.  switch (lgReponse) {
  13.  case  WAIT_OBJECT_0 :
  14.   bResult = TRUE;
  15.   break;
  16.  case WAIT_ABANDONED :
  17.   bResult = FALSE;
  18.   break;
  19.  case WAIT_TIMEOUT :
  20.   bResult = FALSE;
  21.   break;
  22.  }
  23. }
  24. if ((! bResult) && (pCtxt != NULL))
  25. {
  26.  // Trop d'attente, laisser tomber
  27. }
  28. return (bResult);
  29. }


 
Et n'oublies pas aussi, quand l'accès unique est terminé, de faire un ReleaseMutex.
Ce que je te file là, c un vieu truc, ms ça marche bien.
Mais si tu l'utilises pas comme ça, ça peut déja te donner des idées.
Bonne chance.

 

[jfdsdjhfuetppo]--Message édité par el_gringo le 28-05-2002 à 09:46:41--[/jfdsdjhfuetppo]

Reply

Marsh Posté le 28-05-2002 à 10:27:31    

Si j'ai bien compris, j'écrit la fonction "enter_single_thread()" kek'part.
 
Au début de mon application je crée hMutex avec "CreateMutex()"
 
Et lorsque je veux entrer dans une zone critique je fais ça:
 
while(!enter_single_thread(hMutex)) {
  // faire kek'chose d'utile en attendant
}
 
// Je suis entré dans le zone critique, je fais mes accès au fichiers en toute tranquilité
 
// J'ai fini
ReleaseMutex(hMutex);

Reply

Marsh Posté le 28-05-2002 à 10:35:58    

Mog a écrit a écrit :

Si j'ai bien compris, j'écrit la fonction "enter_single_thread()" kek'part.
 
Au début de mon application je crée hMutex avec "CreateMutex()"
 
Et lorsque je veux entrer dans une zone critique je fais ça:
 
while(!enter_single_thread(hMutex)) {
  // faire kek'chose d'utile en attendant
}
 
// Je suis entré dans le zone critique, je fais mes accès au fichiers en toute tranquilité
 
// J'ai fini
ReleaseMutex(hMutex);
 




 
Tu mélanges les threads là.
Quand tu veux qu'un tread ai un accès unique, tu fais un enter_single_tread. Si l'accès n'est pas verouillé, ça te rend TRUE et ça verouille l'accès. Sinon ça te rend false.
Ensuite tu fais un ReleaseMutex un fois que t'as plus besoin que l'accès soit verouillé (et ça permet aux autres threads de pouvoir à leur tour faire un enter_single_thread).
Mais, un conseil, essaye pas en tatonnant, de faire ce que je te dis, prend le temps de comprendre, sinon tu vas galèrer, tu vas passer ton temps à poster pour demander des trucs, et ça va énerver tt le monde (au moins toi et moi en tt cas ! :D)
Allez, bonne chance. (et tiens moi informé qd même !)

Reply

Marsh Posté le 28-05-2002 à 10:54:19    

Je me suis peut-être mal exprimé:
 
Si j'entoure mes fonctions d'accès au fichier (appellées par les threads) par enter_single_thread() et ReleaseMutex(), seul un thread à fois pourra executer une de ces fonctions.
C'est bien ça ?
 
Pourquoi tu dis que je "mélanges les threads" ?

Reply

Marsh Posté le 28-05-2002 à 10:55:39    

Mog a écrit a écrit :

Je me suis peut-être mal exprimé:
 
Si j'entoure mes fonctions d'accès au fichier (appellées par les threads) par enter_single_thread() et ReleaseMutex(), seul un thread à fois pourra executer une de ces fonctions.
C'est bien ça ?




 
Ouais, c ça.
Essaye.

Reply

Marsh Posté le 28-05-2002 à 14:03:02    

Ca a l'air de fonctionner ! Ca plante moins  :pt1cable:  
 
Merci du coup de main.

Reply

Marsh Posté le 28-05-2002 à 14:31:03    

Mog a écrit a écrit :

Ca a l'air de fonctionner ! Ca plante moins  :pt1cable:  
 
Merci du coup de main.  




 
De Rien.
ça plante moins... et ça te suffit !? :D

Reply

Marsh Posté le 28-05-2002 à 14:31:03   

Reply

Marsh Posté le 28-05-2002 à 14:32:41    

En fait j'ai un plantage aléatoire et j'ai des doutes sur plusieurs partie sensible du code.
 
En ayant corrigé ce pb, j'isole peu à peu le vrai pb.

Reply

Marsh Posté le 28-05-2002 à 15:27:26    

Mog a écrit a écrit :

En fait j'ai un plantage aléatoire et j'ai des doutes sur plusieurs partie sensible du code.
 
En ayant corrigé ce pb, j'isole peu à peu le vrai pb.  




 
Bah c'était qd même un vrai problème de ne pas assurer un accès exclusif à un thread !!

Reply

Marsh Posté le 28-05-2002 à 15:29:39    

Oui mais apparemment c'est pas ça qui fait foirer mon appli  :sweat:

Reply

Marsh Posté le 28-05-2002 à 16:17:07    

Mog a écrit a écrit :

 
// Je suis entré dans le zone critique, je fais mes accès au fichiers en toute tranquilité




 
Ca te dis pas d'utiliser les Sections Critiques alors?  :pt1cable:  
 
InitializeCriticalSection
EnterCriticalSection
etc, etc

Reply

Marsh Posté le 28-05-2002 à 16:32:23    

Connaissait pas non plus. Une autre piste à suivre.
 
MErci

Reply

Marsh Posté le 28-05-2002 à 16:32:48    

Ces fonctions utilisent les mutex, donc autant aller a l'essentiel en utilisant direcement les mutex que d'utiliser des api les encapsulant.

Reply

Marsh Posté le 28-05-2002 à 16:33:00    

Mog a écrit a écrit :

Oui mais apparemment c'est pas ça qui fait foirer mon appli  :sweat:  




Ben deja programmer en C
et en plus en multithread :)
c'est une piste..
 
LeGreg

Reply

Marsh Posté le 28-05-2002 à 16:35:09    

KarLKoX a écrit a écrit :

Ces fonctions utilisent les mutex, donc autant aller a l'essentiel en utilisant direcement les mutex que d'utiliser des api les encapsulant.  




 
"La roue à déja été inventée, donc autant ne pas en tenir compte, et la réinventer !"
 
ça te parait logique comme phrase !? à moi, non !
C pourtant à peu près l'équivalent que tu viens de dire !:D

Reply

Marsh Posté le 28-05-2002 à 16:39:43    

legreg a écrit a écrit :

 
Ben deja programmer en C
et en plus en multithread :)
c'est une piste..
 
LeGreg  




 
Ca tiendrais qu'à moi je ferais ça en Java (quoique, c'est déjà lent comme la mort). Mais quand j'ai pas trop le choix des armes.

Reply

Marsh Posté le 28-05-2002 à 16:41:10    

Mog a écrit a écrit :

 
Ca tiendrais qu'à moi je ferais ça en Java (quoique, c'est déjà lent comme la mort). Mais quand j'ai pas trop le choix des armes.  




 
non bien sur c'est rarement par choix ;)
ca me rappelle mes projets de prog systeme :)
 
LeGreg

Reply

Marsh Posté le 28-05-2002 à 18:09:12    

el_gringo a écrit a écrit :

 
 
"La roue à déja été inventée, donc autant ne pas en tenir compte, et la réinventer !"
 
ça te parait logique comme phrase !? à moi, non !
C pourtant à peu près l'équivalent que tu viens de dire !:D  




 
Ca me fait penser à toutes les fonctions machin_ex et machin, sachant que machin est obsolète et n'est qu'un appel au machin_ex
 
Donc utilisons l'obsolète  :pt1cable:  
 
Au fait, tu dois lire ou écrire dans ton fichier? Sinon tu peux utiliser des streams et lire à plusieurs threads à la fois, ca marche super  ;)

Reply

Marsh Posté le 29-05-2002 à 08:30:38    

Zion a écrit a écrit :

 
 
Ca me fait penser à toutes les fonctions machin_ex et machin, sachant que machin est obsolète et n'est qu'un appel au machin_ex
 
Donc utilisons l'obsolète  :pt1cable:  
 
Au fait, tu dois lire ou écrire dans ton fichier? Sinon tu peux utiliser des streams et lire à plusieurs threads à la fois, ca marche super  ;)  




 
Lire et écrire.
C'est bon ça marche, merci de votre aide

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed