Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2033 connectés 

  FORUM HardWare.fr
  Programmation

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°145871
mog
KUPO !
Posté le 28-05-2002 à 09:30:13  profilanswer
 

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 ?

mood
Publicité
Posté le 28-05-2002 à 09:30:13  profilanswer
 

n°145873
karlkox
Posté le 28-05-2002 à 09:37:16  profilanswer
 

utilise les mutex.

n°145874
mog
KUPO !
Posté le 28-05-2002 à 09:39:48  profilanswer
 

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

n°145880
El_gringo
Posté le 28-05-2002 à 09:46:09  profilanswer
 

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]

n°145920
mog
KUPO !
Posté le 28-05-2002 à 10:27:31  profilanswer
 

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);

n°145926
El_gringo
Posté le 28-05-2002 à 10:35:58  profilanswer
 

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 !)

n°145943
mog
KUPO !
Posté le 28-05-2002 à 10:54:19  profilanswer
 

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" ?

n°145948
El_gringo
Posté le 28-05-2002 à 10:55:39  profilanswer
 

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.

n°146121
mog
KUPO !
Posté le 28-05-2002 à 14:03:02  profilanswer
 

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

n°146155
El_gringo
Posté le 28-05-2002 à 14:31:03  profilanswer
 

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

mood
Publicité
Posté le 28-05-2002 à 14:31:03  profilanswer
 

n°146156
mog
KUPO !
Posté le 28-05-2002 à 14:32:41  profilanswer
 

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.

n°146205
El_gringo
Posté le 28-05-2002 à 15:27:26  profilanswer
 

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 !!

n°146209
mog
KUPO !
Posté le 28-05-2002 à 15:29:39  profilanswer
 

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

n°146263
zion
Plop
Posté le 28-05-2002 à 16:17:07  profilanswer
 

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

n°146272
mog
KUPO !
Posté le 28-05-2002 à 16:32:23  profilanswer
 

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

n°146273
karlkox
Posté le 28-05-2002 à 16:32:48  profilanswer
 

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

n°146275
LeGreg
Posté le 28-05-2002 à 16:33:00  profilanswer
 

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

n°146278
El_gringo
Posté le 28-05-2002 à 16:35:09  profilanswer
 

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

n°146281
mog
KUPO !
Posté le 28-05-2002 à 16:39:43  profilanswer
 

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.

n°146284
LeGreg
Posté le 28-05-2002 à 16:41:10  profilanswer
 

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

n°146354
zion
Plop
Posté le 28-05-2002 à 18:09:12  profilanswer
 

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  ;)

n°146639
mog
KUPO !
Posté le 29-05-2002 à 08:30:38  profilanswer
 

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

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation

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

 

Sujets relatifs
Equivalent de nm pour Windows[C] Installation de GTK+ sous windows
Compilateur C sous windows gratos...récuperer les données d'un formulaire xsl-xml en xml
Planificateur de tache windows 2000/XPBase de données Calendrier
[] [base de données] truc de ouf à faire ... arborescence virtuelleéchec de partition magic 7 [Comment récupérer mes données ?]
[Conception Bases de données] du progrès en powerAmc9[C] ouvrir un fichier en données pour un prog...
Plus de sujets relatifs à : Sémaphore/Données critiques en C sous Windows


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR