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

 


Dernière réponse
Sujet : Sémaphore/Données critiques en C sous Windows
mog

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


Votre réponse
Nom d'utilisateur    Pour poster, vous devez être inscrit sur ce forum .... si ce n'est pas le cas, cliquez ici !
Le ton de votre message                        
                       
Votre réponse


[b][i][u][strike][spoiler][fixed][cpp][url][email][img][*]   
 
   [quote]
 

Options

 
Vous avez perdu votre mot de passe ?


Vue Rapide de la discussion
mog

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

zion

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

LeGreg

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

mog

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.

El_gringo

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

LeGreg

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

karlkox Ces fonctions utilisent les mutex, donc autant aller a l'essentiel en utilisant direcement les mutex que d'utiliser des api les encapsulant.
mog Connaissait pas non plus. Une autre piste à suivre.
 
MErci
zion

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

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

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

mog 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.
El_gringo

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

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

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.

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

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

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

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]

mog C'est les sémaphores, non ?
 
Sinon, tu peux expliquer ?
karlkox utilise les mutex.
mog 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 ?

Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)