IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MFC Discussion :

Thread Synchronisation avec structure FIFO ??


Sujet :

MFC

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    87
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2006
    Messages : 87
    Points : 104
    Points
    104
    Par défaut Thread Synchronisation avec structure FIFO ??
    Bonjour j'ai creer un prog multiThread en C++ sous Visual .Net 2003 avec MFC. Bien entendu j'ai des problemes de concurrence d'acces entre mes threads que j'ai resolus grace a une CCriticalSection. Mais vraisemblablement la CCriticalSection utilise une stack (structure LIFO) pour la file d'attente, or moi je voudrai qqch qui utilise une queue (structure FIFO): pour eviter qu'une des mes 4 threads soit quasi bloquee... J'ai beau chercher sur la msdn, sur developpez.com, et sur Internet en general: je trouve pas !!

    Merci par avance pour votre aide

  2. #2
    mat.M
    Invité(e)
    Par défaut Re: [MFC] Thread Synchronisation avec structure FIFO ???
    Citation Envoyé par vincedom
    Bonjour j'ai creer un prog multiThread en C++ sous Visual .Net 2003 avec MFC. Bien entendu j'ai des problemes de concurrence d'acces entre mes threads que j'ai resolus grace a une CCriticalSection. Mais vraisemblablement la CCriticalSection utilise une stack (structure LIFO) pour la file d'attente, or moi je voudrai qqch qui utilise une queue (structure FIFO): pour eviter qu'une des mes 4 threads soit quasi bloquee... J'ai beau chercher sur la msdn, sur developpez.com, et sur Internet en general: je trouve pas !!

    Merci par avance pour votre aide
    Impossible il me semble
    Ou alors modifier le code source des MFC ( attention: lier les MFC de manière statique ) ou au mieux ne pas utiliser CCriticalSection mais DIRECTEMENT avec les API comme EnterCriticalSection

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    87
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2006
    Messages : 87
    Points : 104
    Points
    104
    Par défaut
    Salut

    Je me fiche d'utiliser MFC ou directement les API Windows. J'ai regarde un peu les differents Semaphores, Moniteurs et autres Mutex MFC et j'ai rien trouve ... Mais de toute facon je suis pas sur que ca change des masses vu que par exemple une CCriticalSection c juste un petit mappage d'une CRITICAL_SECTION.
    Mais il doit qu'en meme bien y avoir un truc tout fait qui te permet de faire un synchronisation avec une structure LIFO : Ca parait bien plus normal de faire de la synchro avec du LIFO qu'avec du FIFO.
    les premiers seront les derniers
    Mais qu'en meme

  4. #4
    Membre confirmé Avatar de themadmax
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    446
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 446
    Points : 496
    Points
    496
    Par défaut
    Les sections critiques ne permet seulement d'executer une partie du code d'un programme sans changé de thread.
    Si differant thread accede a une ressource partage, protegé par une section critique, le premier accede a celle-ci, mais les suivants son bloqué jusqu'a la liberation de celle-ci. Ce qui suit une FIFO (le premier entré sera le premier sortie).
    Voici un programme de test utilisant API windows CRITICAL_SECTION, (Normalement identique au MFC)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    // CritcalSection.cpp : Defines the entry point for the console application.
    //
     
    #include "stdafx.h"
    #include "windows.h"
     
    class CriticalSection
    {
    	CRITICAL_SECTION m_criticalSection;
    public :
    	CriticalSection()
    	{InitializeCriticalSection(&m_criticalSection);}
    	~CriticalSection()
    	{DeleteCriticalSection(&m_criticalSection);}
    	void enter()
    	{ EnterCriticalSection(&m_criticalSection);}
    	void leave()
    	{ LeaveCriticalSection(&m_criticalSection);}
    };
     
    CriticalSection	cs;
     
    int data = 0;
     
    void accessSecData(int id) {
    	cs.enter();
    	data++;
    	char str[255];
    	sprintf_s( str, sizeof(str), "IdThread=%d\n", id);
    	printf( str );
    	Sleep(1000);
    	cs.leave();
    }
     
    DWORD WINAPI ThreadProc(LPVOID lpParameter)
    {
    	int *id = (int*)lpParameter;
    	accessSecData(*id);
    	return 0;
    }
     
     
    int _tmain(int argc, _TCHAR* argv[])
    {
    	CriticalSection	cs;
     
    	DWORD dwThreadID;
    	int t1 = 1;
    	int t2 = 2;
    	int t3 = 3;
    	HANDLE thread1 = CreateThread( (LPSECURITY_ATTRIBUTES) NULL,
                       0,
                       (LPTHREAD_START_ROUTINE) ThreadProc,
                       (LPVOID) &t1,
                        0, &dwThreadID );
    	HANDLE thread2 = CreateThread( (LPSECURITY_ATTRIBUTES) NULL,
                       0,
                       (LPTHREAD_START_ROUTINE) ThreadProc,
                       (LPVOID) &t2,
                        0, &dwThreadID );
    	HANDLE thread3 = CreateThread( (LPSECURITY_ATTRIBUTES) NULL,
                       0,
                       (LPTHREAD_START_ROUTINE) ThreadProc,
                       (LPVOID) &t3,
                        0, &dwThreadID );
     
    	::WaitForSingleObject( thread1, INFINITE );
    	::WaitForSingleObject( thread2, INFINITE );
    	::WaitForSingleObject( thread3, INFINITE );
    	return 0;
    }
    Sortie du programme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    IdThread=1
    IdThread=2
    IdThread=3
    Press any key to continue . . .
    ________________________________________________
    http://bliquid.fr : Blog sur Android et l'Acer Liquid

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    87
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2006
    Messages : 87
    Points : 104
    Points
    104
    Par défaut
    NON

    La CCriticalSection de MFC mappe CRITICAL_SECTION mais bon j'ai reessayer pour etre sur et CRITICAL_SECTION utilise une structure LIFO: c'est pas du PIPO

    Bon enfin de toute facon je vais modifier l'architecture de mon prog et vire la critical section....

    Mais sans blague c pas propre du tout de pas avoir des objets pour synchroniser avec une structure FIFO... Mon prog prend quasiment continuellement 100% du cpu et il est cense faire de l'analyse en temps reel... Alors quand une thread reste bloquer 30 sec... Oups

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    87
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2006
    Messages : 87
    Points : 104
    Points
    104
    Par défaut
    Salut

    Suite a un message prive de "themadmax" j'ai ecrit un petit prog de demo pour montrer que la structure d'attente de CRITICAL_SECTION etait pas FIFO ...
    Et la ca marchait parfaitement avec une belle struture FIFO....
    Je suis retourne a mon prog principal pour verifier que j'etais pas fou
    Et apres une ultime recherche internet j'ai fini par trouve un truc sur msdn:
    http://msdn.microsoft.com/msdnmag/issues/06/03/ConcurrentAffairs/
    Au fait c du FIFO mais parfois marche pas !!!

    Bon de toute facon de mon cote dans mon prog je vais m'arranger pour supprimer la critical section.

    Merci pour votre aide

    Je crois que le sujet est clos....

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. synchronisation Thread main avec sous thread
    Par glasgow dans le forum Concurrence et multi-thread
    Réponses: 20
    Dernier message: 25/05/2009, 15h03
  2. [Thread] Synchronisation d'un QThread avec l'IHM
    Par cfdev dans le forum Multithreading
    Réponses: 12
    Dernier message: 04/06/2008, 00h21
  3. [Thread][Synchronisation] Exclusion mutuelle
    Par masto dans le forum Concurrence et multi-thread
    Réponses: 8
    Dernier message: 20/01/2005, 16h02
  4. Réponses: 12
    Dernier message: 26/04/2004, 08h32
  5. Thread probs avec WaitFor()
    Par pixelrock dans le forum C++Builder
    Réponses: 2
    Dernier message: 04/11/2002, 09h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo