Bonjour,
Je commence à suivre un tuto sur Qt (ici: [ame="http://www.youtube.com/watch?v=JaGqGhRW5Ks&list=SP2D1942A4688E9D63"]C++ Qt 28 - QThread part 1 creating a thread - YouTube[/ame]) les videos 28 à 30 parlent des threads et mutex.
J'utilise la version 5 de Qt contrairement au tuto qui se base sur la 4.
L'exemple en question est très basique, il s'agit d'une application console qui instancie trois threads qui contiennent une simple boucle qui va afficher nom du thread + itération.
Dans la vidéo lorsque l'instructeur exécute le programme il obtient en output une ligne par instruction qDebug() << this->name << i; et ce qu'il utilise ou non un mutex.
Chez moi avec ou sans le mutex certaines instructions se "chevauchent"... en gros << n'est pas atomique même avec mutex...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 "mThread1" 938 "mThread2" 944 "mThread1" 939 "mThread3" 912
fichier mythread.h:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 "mThread1" 9"mThread2"38 944 "mThread1" 939 "mThread3" 912
fichier mythread.cpp:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 #ifndef MYTHREAD_H #define MYTHREAD_H #include <QtCore> class MyThread:public QThread { public: MyThread(); void run(); QString name; }; #endif // MYTHREAD_H
main.cpp
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 #include "mythread.h" #include <QtCore> #include <QDebug> MyThread::MyThread() { } void MyThread::run() { qDebug() << this->name << " Running"; for(int i=0; i<1000; i++) { QMutex mutex; mutex.lock(); qDebug() << this->name << i; mutex.unlock(); } }
Ma question serai double: pourquoi cette différence de comportement sur ma machine et celle de la vidéo? Et pourquoi le mutex ne solutionne pas mon problème.
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 #include <QCoreApplication> #include <mythread.h> int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); MyThread mThread1; mThread1.name = "mThread1"; mThread1.start(); MyThread mThread2; mThread2.name = "mThread2"; mThread2.start(); MyThread mThread3; mThread3.name = "mThread3"; mThread3.start(); return a.exec(); }
Merci d'avance.
Partager