Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

thread et passage de parametre

21 réponses
Avatar
Bruno Causse
bonjour,

pour les threads je ne sert d'une strategie a la "java"

une classe abstraite pure (Interface)

class Runnable{
public:
virtual void run() = 0;
}

un classe thread tres simple (un simple wrapper des threads POSIX)

class POSIXThread {
pthread_t _threadID;

public :

POSIXThread(Runnable *ptr);
virtual ~POSIXThread() {};

void start();

protected:

static void* threadfunction(void * pt);
Runnable* _threadObj;
};

class RXEngine : public Runnable {

.../...

//variable d'instance
RXParamThread param;

//metode d'instance
void dansUneFonctionInit();
virtual void run();

};

void RXEngine::dansUneFonctionInit() {

param.init();
RXThread thread(this);
thread.start();

}

void RXEngine::run() {

//ici je peu utiliser la variable d'instance param

}

il y a t'il une facon plus elegante des passer la variable "param"

merci
--
Bruno Causse

1 réponse

1 2 3
Avatar
James Kanze
On Sep 16, 9:28 am, Michael DOUBEZ wrote:
James Kanze a écrit :
> On Sep 15, 9:39 am, Michael DOUBEZ wrote:
>> Sylvain SF a écrit :



>>> Sylvain SF wrote on 15/09/2008 03:35:
>>> la convention d'appel est imposé comme "nettoyage par la
>>> fonction" mais la méthode statique passé en paramètre à
>>> "CreateThread" (création d'un thread selon MS) n'est pas
>>> déclarée 'extern "C"'.
>> Je ne comprends toujours pas le problème. Si l'ABI est la
>> même[...]



> C'est là précisement la question. Du point du vue de la
> norme, c'est le linkage qui détermine l'ABI ; le C et le C++
> ne sont pas obligé à avoir le même linkage (et en partie, ne
> peut l'avoir, puisque l'ABI du C++ précise aussi
> l'organisation de la vtable, etc.). De même, Microsoft offre
> plusieurs linkage différents (avec des ABI différentes) en
> guise d'extension.



Dans ce cas, comment appeler du C++ à partir du C ? Si je me
souviens bien, il n'y a pas de moyen portable de faire cela
(pas de extern "c++" dans la norme C).



A moins d'une particularité de compilateur (un pragma?), il
faut dont bien à un moment que les ABI communiquent de C vers
C++ sinon la norme POSIX ne sers plus à rien.



Ça peut se faire au moyen d'une extension en C (pragma ou
autre). Mais les compilateurs C que je connais ne savent générer
que des appels aux conventions C. C'est donc à l'autre langage
de s'adapter. En C++, si tu déclares une fonction avec linkage
C, elle utilise les conventions C ; elle peut donc être appelée
depuis le C (ou par n'importe quel code respectant les
conventions C).

Quant à Posix, il ne connaît que le C aussi. Donc, tout ce qui
touche à Posix doit avoir un linkage "C". C'était précisement le
point de démarrage de ce sous-thread : il faut que la fonction
dont tu donnes l'adresse à pthread_create ait un linkage "C".

>> alors les convention d'appel sont respectées et, à moins
>> que l'exception ne se propage jusqu'à la couche POSIX, il
>> n'y a pas de problème.



> Mais les conventions d'appel dépendent du linkage. Je me suis
> bien servi des compilateurs où les conventions étaient
> différentes entre le C et le C++.



Dans ce là, comment est ce que ça se passe? Est ce que
certaines fonctions sont exportées avec une ABI différente ou
est ce qu'il faut spécifier l'ABI de la fonction à utiliser ?



Si la fonction a un linkage "C++" (le défaut), le compilateur
génère un appel avec les conventions C++. Si la fonction a un
linkage "C", il génère un appel avec les conventions C.

C'est justement le but du linkage. Mais du coup, le linkage fait
partie du type, y compris du type d'un pointeur à fonction. Si
un pointeur à fonction a un linkage "C", tu ne peux lui affecter
que des adresses des fonctions à linkage "C", et quand le
compilateur génère un appel de fonction à travers ce pointeur,
il utilise les conventions C (mais la plupart du temps, on passe
de tels pointeurs à du C, qui lui appelle la fonction).

--
James Kanze (GABI Software) email:
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
1 2 3