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:
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