[Debutant] pthreads et classe/objets
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
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 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_;
}; |
my_thread.cpp
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 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;
}; |
prog.cpp
Code:
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;
} |
Compilation sous linux:
Code:
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 |
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.
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.