Voilà j'ai réussi à reproduire le crash, ça crash à un moment aléatoire à l'exécution :
Classe bidule : fichier bidule.h
#ifndef BIDULE
#define BIDULE
#include "truc.h"
#include <vector>
class Bidule {
public :
static Truc* getTruc (std::string name);
static void addTruc (Truc *truc);
private :
static std::vector<Truc*> trucs;
};
#endif // BIDULE
fichier bidule.cpp
#include "bidule.h"
using namespace std;
vector<Truc*> Bidule::trucs = vector<Truc*>();
void Bidule::addTruc (Truc * truc) {
trucs.push_back(truc);
}
Truc* Bidule::getTruc (string name) {
for (int i = 0; i < trucs.size(); i++)
if (trucs[i]->getName() == name)
return trucs[i];
return nullptr;
}
Classe Truc : fichier.h
#ifndef TRUC_H
#define TRUC_H
#include <string>
class Truc {
private:
int m_iVar;
std::string m_sName;
public:
Truc (std::string sName, int iVar);
int& getIVar();
void setIVar(int ivar);
std::string getName();
};
#endif
fichier.cpp
#include "truc.h"
using namespace std;
Truc::Truc(string sName, int iVar) : m_iVar(iVar), m_sName(sName) {
}
string Truc::getName() {
return m_sName;
}
int& Truc::getIVar() {
return m_iVar;
}
void Truc::setIVar(int i) {
m_iVar = i;
}
Classe MyThread : fichier.h
#ifndef MY_THREAD
#define MY_THREAD
#include <SFML/System.hpp>
#include "truc.h"
#include "bidule.h"
#include "gbls.h"
#include <random>
#include <iostream>
#include "mySecondThread.h"
class MyThread {
public :
MyThread ();
void start ();
private :
void run ();
Truc* truc;
sf::Thread m_thread;
MySecondThread m_secondThread;
};
#endif // MY_THREAD
fichier.cpp
#include "mythread.h"
using namespace std;
MyThread::MyThread () : m_thread (&MyThread::run, this) {
Truc* t = new Truc("TRUC", 5);
Bidule::addTruc(t);
truc = Bidule::getTruc("TRUC");
}
void MyThread::start () {
//m_secondThread = new MySecondThread(20);
m_thread.launch();
m_secondThread.start();
}
void MyThread::run () {
while (true) {
globalMutex.lock();
int iVar = rand() % 100;
truc->setIVar(iVar);
cout<<"iVar : "<<truc->getIVar()<<endl;
globalMutex.unlock();
}
}
Classe MySecondThread : fichier.h
#ifndef MY_SECOND_THREAD
#define MY_SECOND_THREAD
class MySecondThread {
public :
MySecondThread ();
void start ();
private :
void run ();
Truc* truc;
sf::Thread m_thread;
};
#endif // MY_SECOND_THREAD
fichier.cpp
#include "mythread.h"
using namespace std;
MySecondThread::MySecondThread () : m_thread (&MySecondThread::run, this) {
truc = Bidule::getTruc("TRUC");
}
void MySecondThread::start () {
m_thread.launch();
}
void MySecondThread::run () {
while (true) {
globalMutex.lock();
int iVar = rand() % 100;
truc->setIVar(iVar);
cout<<"iVar : "<<truc->getIVar()<<endl;
globalMutex.unlock();
}
}
Mon mutex :
#ifndef GBLS_H
#define GBLS_H
#include <SFML/System.hpp>
static sf::Mutex globalMutex;
#endif // GLOBAL_H
Et le main :
#include <ctime>
#include <random>
#include "mythread.h"
#include <iostream>
using namespace std;
int main () {
srand(time(NULL));
MyThread myThread;
myThread.start();
Truc *truc = Bidule::getTruc("TRUC");
while (true) {
globalMutex.lock();
int iVar = rand() % 100;
truc->setIVar(iVar);
cout<<"iVar : "<<truc->getIVar()<<endl;
globalMutex.unlock();
}
return 0;
}
Voilà, si j'utilise un pointeur sur MySecondThread dans la classe MyThread et que je crée le thread plus tard ça ne crash plus mais je ne sais pas si c'est une bonne solution pour régler le problème car ça pourrait planter sur un autre OS ou bien planter au bout de 2h.
PS : ça crash aussi à différents moment si je lance le débugueur ou pas : si je lance le débugueur ça crash tout de suite, sinon, si je le lance normalement ça crash plus tard.
PS 2 : voilà donc comment faire du code qui crash de manière aléatoire.