Sémaphore/Données critiques en C sous Windows - Programmation
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 :
|
A l'entrée dans le Tread principal, tu fais
Code :
|
Ensuite, quand tu veux garantir un accès unique, tu fais un appel à cette fonction:
Code :
|
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]
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);
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 ! )
Allez, bonne chance. (et tiens moi informé qd même !)
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" ?
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.
Marsh Posté le 28-05-2002 à 14:03:02
Ca a l'air de fonctionner ! Ca plante moins
Merci du coup de main.
Marsh Posté le 28-05-2002 à 14:31:03
Mog a écrit a écrit : Ca a l'air de fonctionner ! Ca plante moins Merci du coup de main. |
De Rien.
ça plante moins... et ça te suffit !?
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.
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 !!
Marsh Posté le 28-05-2002 à 15:29:39
Oui mais apparemment c'est pas ça qui fait foirer mon appli
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?
InitializeCriticalSection
EnterCriticalSection
etc, etc
Marsh Posté le 28-05-2002 à 16:32:23
Connaissait pas non plus. Une autre piste à suivre.
MErci
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.
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 |
Ben deja programmer en C
et en plus en multithread
c'est une piste..
LeGreg
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 !
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.
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
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 ! |
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
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
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 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
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 ?