Bon, déjà là j'ai un code qui crash, et pourtant, ma configuration est la même que pour dans mon plus gros projet, j'utilise exactement la même version de SFML.
Le fichier globals.h qui contient le mutex :
#ifndef GLOBALS_H
#define GLOBALS_H
static sf::Mutex globalMutex;
#endif // GLOBAL_H
Le fichier mythread.h (c'est ce qui remet à jour la position des entités dans le monde, dans mon plus gros projet.)
#ifndef MY_THREAD
#define MY_THREAD
#include <SFML/System.hpp>
#include "truc.h"
#include "bidule.h"
#include "globals.h"
#include <random>
class MyThread {
public :
MyThread ();
void start ();
private :
void run ();
Truc* truc;
sf::Thread m_thread;
};
#endif // MY_THREAD
Le fichier mythread.cpp
#include "mythread.h"
using namespace std;
MyThread::MyThread () : m_thread (&MyThread::run, this) {
truc = Bidule::getTruc();
}
void MyThread::start () {
m_thread.launch();
}
void MyThread::run () {
while (true) {
globalMutex.lock();
int iVar = rand() % 100;
truc->setIVar(iVar);
globalMutex.unlock();
}
}
bidule.h (ce qui correspond au World dans mon plus grand projet.)
#ifndef BIDULE
#define BIDULE
#include "truc.h"
class Bidule {
public :
static Truc* getTruc() {
if (truc == nullptr) {
static Truc *t = new Truc(5);
return t;
}
return truc;
}
static int& getIVar ();
static void setIVar(int ivar);
private :
static Truc *truc;
};
#endif // BIDULE
bidule.cpp.
#include "bidule.h"
Truc* Bidule::truc = nullptr;
int& Bidule::getIVar () {
return truc->getIVar();
}
void Bidule::setIVar (int iVar) {
truc->setIVar(iVar);
}
le fichier truc.h (ce qui correspond à la map dans mons plus gros projet.)
#ifndef TRUC_H
#define TRUC_H
class Truc {
private:
int m_iVar;
public:
Truc (int iVar);
int& getIVar();
void setIVar(int ivar);
};
#endif
Et le fichier .cpp :
#include "truc.h"
Truc::Truc(int iVar) : m_iVar(iVar) {
}
int& Truc::getIVar() {
return m_iVar;
}
void Truc::setIVar(int i) {
m_iVar = i;
}
Et la main :
#include <ctime>
#include <random>
#include "mythread.h"
int main () {
srand(time(NULL));
MyThread myThread;
myThread.start();
return 0;
}
Le débugueur me dis ça :
#0 6898174C sf::Mutex::Mutex() () (D:\Projets-c++\TestThreadMutex\bin\Debug\sfml-system-2.dll:??)
#1 004017DD __static_initialization_and_destruction_0(__initialize_p=1, __priority=65535) (D:/Projets-c++/TestThreadMutex/globals.h:3)
#2 00401805 _GLOBAL__sub_I__ZN8MyThreadC2Ev() (D:\Projets-c++\TestThreadMutex\mythread.cpp:14)
#3 0040261A __do_global_ctors () (??:??)
#4 40000060 ?? () (??:??)
#5 0000003D ?? () (??:??)
#6 00962F20 ?? () (??:??)
#7 762333AA KERNEL32!BaseCleanupAppcompatCacheSupport() (C:\Windows\syswow64\kernel32.dll:??)
#8 0028FFD4 ?? () (??:??)
#9 76FB9EF2 ntdll!RtlpNtSetValueKey() (C:\Windows\system32\ntdll.dll:??)
#10 7EFDE000 ?? () (??:??)
#11 76FB9EC5 ntdll!RtlpNtSetValueKey() (C:\Windows\system32\ntdll.dll:??)
#12 004014E0 WinMainCRTStartup () (??:??)
#13 7EFDE000 ?? () (??:??)
#14 ?? ?? () (??:??)
PS : j'ai le même soucis avec les thread du c++11 donc le bug ne vient pas de la SFML mais de je ne sais pas trop ou, une librairie de plus bas niveau sans doute.