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:
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:
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:
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:
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:
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>";
}
}; |