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

Threads & Processus C++ Discussion :

Qestion sur Mutex et Thread


Sujet :

Threads & Processus C++

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2009
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Février 2009
    Messages : 28
    Par défaut Qestion sur Mutex et Thread
    Bonjour, je vous explique tout d'abord mon programme:
    Mon programme main lance deux threads, un pour lire dans un fichier, il envoit ensuite la ligne dans une ''zone de transit'', et l'autre thread extrait, de la zone de transit, la ligne et l'écrit ensuite dans un autre fichier. J'ai un erreur à l'exécution et je ne comprend pas pourquoi:

    (je sais que ça fait beaucoup de code, mais mon erreur est exactement dans ma classe mutex (2ieme bloc de code), dans mon WaitForSingleObject(m_Mutex,INFINITE); le déboggeur me lance ceci: Unhandled exception at 0x0040187a in TP2_1(2005).exe: 0xC0000005: Access violation reading location 0x00000020.


    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
    #include <iostream> // cout, endl
    #include "Lecteur.h"
    #include "Typographie.h"
    unsigned long __stdcall Lecture (void*);
    unsigned long __stdcall Typographe (void*);
     
    int main()
    {
    	Lecteur		oLecture;
     
    	HANDLE		hLecture;
    	HANDLE		hTypographe;
     
    	hLecture = ::CreateThread (0,0, Lecture, &oLecture,0,0);
    	hTypographe = ::CreateThread (0,0, Typographe, 0,0,0);
     
    	HANDLE LesHandles [] = { hLecture, hTypographe };
    	WaitForMultipleObjects (2, LesHandles, TRUE, INFINITE);
     
    	::CloseHandle (hLecture);
    	::CloseHandle (hTypographe);
    }
     
    unsigned long __stdcall Lecture (void* pLecture)
    {
    	Lecteur *p = reinterpret_cast<Lecteur *> (pLecture);
    	p->LireFichier();
    	return 0;
    }
     
    unsigned long __stdcall Typographe (void* pTypographe)
    {
    	Typographie *p = reinterpret_cast<Typographie *> (pTypographe);
    	p->Ecrire();
    	return 0;
    }
    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
    #ifndef MUTEX_H
    #define MUTEX_H
    #include <windows.h>
    class Mutex
    {
    	HANDLE m_Mutex;
    public:
    	Mutex () throw()
    		:m_Mutex(::CreateMutex(0,FALSE,0))
    	{
    	}
    	~Mutex() throw ()
    	{
    		if (m_Mutex) ::CloseHandle (m_Mutex);
    	}
    	void Obtenir () const throw()
    	{ ::WaitForSingleObject(m_Mutex,INFINITE); }
    	void Relacher () const throw()
    	{ ::ReleaseMutex (m_Mutex); }
    };
    #endif
    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
    #ifndef AUTOVERROU_H
    #define AUTOVERROU_H
    #include "Mutex.h"
     
    class Autoverrou
    {
    	Mutex &m_Mutex;
    public:
    	Autoverrou (Mutex &m) throw()
    		:m_Mutex(m)
    	{
    		m_Mutex.Obtenir();
    	}
    	~Autoverrou () throw()
    	{ m_Mutex.Relacher(); }
    };
    #endif
    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
    // Zone de transit entre le lecteur et le décorateur
    #include <string>
    using std::string;
    #include "Mutex.h"
    #include "Autoverrou.h"
    class ZoneTransit
    {
    	string m_Texte;
    	Mutex m_Mutex;
    	string sNomFichier_;
    public:
    	string Extraire ()
    	{
    		Autoverrou av (m_Mutex);
    		string temp = m_Texte;
    		m_Texte.clear ();
    		return temp;
    	}
    	void Ajouter (const string &s)
    	{
    		Autoverrou av(m_Mutex);
    		m_Texte += s;
    	}
    	void SetNomFichier(string sNomFichier)
    	{
    		sNomFichier_ = sNomFichier;
    	}
    	string GetNomFichier()
    	{
    		return sNomFichier_;
    	}
    };
    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
    #include <fstream>
    #include <iostream>
    #include <string>
    using namespace std;
     
    class Typographie
    {
    	ZoneTransit oZone;
    public:
    	Typographie()
    	{	}
    	~Typographie()
    	{	}
    	void Ecrire()
    	{
    		ofstream oFichier;
    		string sNomFichier = "source.html";
    		oFichier.open(sNomFichier.c_str());
    		oFichier << "<HTML><HEAD><TITLE>Source</TITLE></HEAD><BODY>" + oZone.Extraire() + "</BODY></HTML>";
    	}
    };

  2. #2
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Salut,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    hTypographe = ::CreateThread (0,0, Typographe, 0,0,0);
    Manquerait pas le paramètre Typographie tout bêtement ?

Discussions similaires

  1. Timeout sur pool de threads
    Par ploxien dans le forum Concurrence et multi-thread
    Réponses: 1
    Dernier message: 17/08/2007, 15h24
  2. Réponses: 2
    Dernier message: 10/11/2006, 23h08
  3. [Pattern]PB sur Singleton multi-thread
    Par thibaut dans le forum Général Java
    Réponses: 21
    Dernier message: 11/09/2006, 09h33
  4. [VB.NET] Contôles créés sur un autre thread
    Par toniolol dans le forum Windows Forms
    Réponses: 2
    Dernier message: 13/07/2006, 21h42
  5. [XPATH] Erreur XPath sur du multi-thread
    Par pvoncken dans le forum Format d'échange (XML, JSON...)
    Réponses: 2
    Dernier message: 08/02/2006, 15h19

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