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 : 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_;
 
};
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
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 : 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;
}
Compilation sous linux:
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
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.