Précédent   Forum du club des développeurs et IT Pro > Autres langages > Autres langages > D
D Forum d'entraide sur la programmation en langage D
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 02/05/2011, 18h22   #1
o.deb
Nouveau Membre du Club
 
Inscription : novembre 2009
Messages : 36
Détails du profil
Informations forums :
Inscription : novembre 2009
Messages : 36
Points : 25
Points : 25
Par défaut Fonction templatée qui ne reconnaît pas ses arguments

bonjour

j'essaie de faire une fonction "pratique" pour la programmation multithread. elle lancera une autre fonction dans un nouveau thread ou pas en fonction du nombre de coeurs disponibles (indépendamment des autres applications en cours évidemment).
c'est du bricolage, donc si vous avez des idées d'amélioration hésitez pas ^^.
donc en gros la fonction prend en paramètres 2 fonctions et 2 arguments pour les fonctions.
la première fonction retourne void car c'est celle qui sera lancée avec std.concurrency.spawn() si un coeur est disponible. elle sera appelée avec le premier argument. la deuxième fonction est celle qui sera lancée si aucun coeur n'est disponible. elle est appelée avec le deuxième argument.
si un nouveau thread a été lancé, ce qui est intéressant à récupérer est son Tid, sinon c'est la valeur de retour de la deuxième fonction.
pour savoir quel type de valeur j'ai récupéré, j'ai fait une classe avec en template le type de retour de la deuxième fonction. cette classe contient 2 éléments, un Tid et un élément du type template, comme ça l'un ou l'autre est vide, et je peux savoir ce que j'ai récupéré (quand je disais que c'était bricolé...).
le problème est que j'obtiens une erreur à la compilation, alors que je ne vois pas ce qui ne correspond pas:
Citation:
Error: template instance lancer!(& ftestThread,& ftest,args,v) does not match template declaration lancer(R,ARGFT,ARGF)
à part ça, j'ai trouvé la fonction std.cpuid.threadsPerCPU() pour connaitre le nombre de coeurs par processeur, mais connaissez-vous une fonction qui donne le nombre de processeurs pour les cas d'ordinateurs multiproc?

voici le code utile pour la première partie:
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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
public static RetLancement!R lancer(R, ARGFT, ARGF)
				   (void function(ARGFT) ft,
				    R function(ARGF) f,
				    ARGFT ftArgs, ARGF fArgs) {
	if (un coeur est disponible) {
		return new RetLancement!R(spawn(ft, ftArgs));
	} else {
		return new RetLancement!R(f(fArgs));
	}
}

class RetLancement(T) {
	
	protected T val;
	protected Tid tid;
	
	public this(T val) {
		this.val = val;
	}
	
	public this(Tid tid) {
		this.tid = tid;
	}
	
	public bool estTid() {
		return tid != Tid.init;
	}
	
	public Tid getTid() {
		return tid;
	}
	
	public T getVal() {
		return val;
	}
}

// la structure et les 2 fonctions suivantes sont pour le test

struct ArgsFtestThread {
	Tid tidPere;
	int n;
}

void ftestThread(ArgsFtestThread args) {
	send(args.tidPere, ftest(args.n));
}

int ftest(int n) {
	return n;
}

void main() {
	int v = 20;
	ArgsFtestThread args;
	args.tidPere = thisTid;
	args.n = v;
	
	// là où se produit l'erreur de compilation
	auto rl = lancer!(&ftestThread, &ftest, args, v);
	...
}
merci
o.deb est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 05h13.


 
 
 
 
Partenaires

Hébergement Web