Bonjour,
je viens de débuter sur les pthreads notamment sur la doc en C. Je voulais passer tout cela en C++ et j'ai notamment trouvé cela:
Threads in C++
qui m'aurait semblé être un bon début. Je pensais qu'il suffisait de mettre les bonnes fonctions de pthread, mais apparemment cela n'a pas l'air aussi simple. Donc, j'ai tenté un truc, mais cela ne fonctionne pas:
my_thread.hpp
my_thread.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
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37 #include <pthread.h> #include <iostream> using namespace std; typedef pthread_t THREADID; class my_Thread { public: // Constructor my_Thread(); // Destructor ~my_Thread(); // Create the thread and start it int Start(void * arg); protected: int Run(void * arg); static void * EntryPoint(void*); virtual void* Execute(void*); void * Arg() const {return Arg_;} void Arg(void* a){Arg_ = a;} private: // Thread Id THREADID my_ThreadId_; // Arguments for the thread void * Arg_; };
prog.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
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48 #include "my_thread.hpp" // Constructors my_Thread::my_Thread() {my_ThreadId_ = 0;}; // Destructor my_Thread::~my_Thread() {}; // Create the thread and start it int my_Thread::Start(void * arg) { int code=1; Arg(arg); // store user data if(pthread_create(&this->my_ThreadId_, NULL, my_Thread::EntryPoint, (void *)this)) { cout << "Erreur" << endl; } return code; }; // Start your code int my_Thread::Run(void * arg) { Execute(arg); return 0; }; /*static */ void * my_Thread::EntryPoint(void * pthis) { my_Thread* pt = (my_Thread*) pthis; pt->Run(pt->Arg()); return NULL; }; // Your code void* my_Thread::Execute(void* arg) { // Your code goes here /* ... */ cout << "Hello World! "<< endl; return NULL; };
Compilation sous linux:
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 #include "my_thread.hpp" #include <iostream> using namespace std; int main() { my_Thread entree; int t=1; entree.Start((void *)t); return 0; }
Le debogueur me signal "Illegal instruction" au niveau du pt->Run(pt->Arg()). Il semble que c'est cette ligne qui pose problème: je n'ai pas l'affichage du "Hello World!". L'idée de reprendre la classe de cette manière me permettra notamment de gérer un thread=un objet.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 g++ -g -o my_thread.o -c my_thread.cpp g++ -g -o prog.o -c prog.cpp g++ -lpthread -g -o prog.exe my_thread.o prog.o
Voilà, si quelqu'un a des idées pour m'aider svp.
PS: Ayant parcouru le forum, je tiens à signaler que je ne peux pas utiliser Boost: pthread m'est imposé par le projet sur lequel je suis, malheureusement.
Partager