2009-04-26 11 views
1

Ich habe eine Funktion, die jedes Mal mit einer anderen Anzahl von Threads aufgerufen werden muss (mache eine Leistungsberechnung, also muss wissen, wann sich die Leistung verschlechtert). Beispiel ist unten angegeben:Aufrufen einer Funktion mit einer anderen Anzahl von Threads, die an die Anwendung übergeben werden

getTime() { 
    return 0; 
} 

int main() { 
    boost::threadpool::thread_pool<> threads(nThreads); 

    for(int j = 0; j <= nLines; j++){ 
     threads.schedule(boost::bind(&getTime, nThreads, 1)); 
    } 

    threads.wait(); 
} 

Wo, NTHREADS: Ein Wert in der Befehlszeile angegeben

Meine Frage ist, würde dies geben Sie mir das gewünschte Ergebnis, wie die Funktion ‚getTime‘ zu würde dies nennen mit "nThreads" jedes Mal, wenn auf die for-Schleife vom Programm zugegriffen wird? Oder brauche ich eine andere Methode, um dasselbe herauszufinden?

, was ich wirklich tun will, ist dies:

boost::threadpool::thread_pool<> threads(nThreads); 
// start a new thread that calls the "getTime" function 
for(int j = 0; j <= nLines; j++){ 
    //threads.schedule(boost::bind(&getTime, nThreads, 1)); 
    threads.schedule(boost::bind(&getTime, 0, nLines, pc)); 
} 

(nicht sicher, welche der oben genannten korrekt ist.)

die getTime() Funktion mit einer bestimmten Anzahl von Zeilen ausgeführt werden soll was ich aus einer textdatei bekomme und jeder zeile eine api gebe, deren leistung ich berechnen möchte. aber das hat nichts mit meiner Frage zu tun.

Ich möchte jedes Mal eine Funktion mit einer anderen Anzahl von Threads aufrufen und berechnen, wie viel Zeit es dauerte, bis jeder Thread fertig war. was die Gesamtzeit mit 1 Faden genommen, was die Gesamtzeit von 2 Fäden genommen wurde etc.

Antwort

1

zu beenden Wenn ich richtig verstehe, was Sie wirklich wollen, ist so etwas zu tun:

int main() 
{ 
    int nbThreads = 20; 
    boost::threadpool::thread_pool<> threads(nbThreads); 

    for(int threadId = 0; threadId <= nbThreads ; ++threadId) 
    { 
     threads.schedule(getTime); 
    } 
    threads.wait(); 
} 

Wenn ich recht habe, brauchen Sie boost :: bind hier nicht zu benutzen.

Beachten Sie, dass Boost.ThreadPool nicht Teil von Boost (noch? Es) ist. Es wird reviewed sein, aber es wurde noch kein Bewertungstermin geplant.

+0

Entschuldigung mein schlechtes. Ich habe nicht angegeben, dass der Prozess für mehrere verschiedene Werte ausgeführt werden soll, die in dieser Zeilenvariablen gespeichert und in getTime() initialisiert werden. Daher die Voraussetzung für eine FOR-Schleife. Was du gegeben hast, würde eine andere FOR-Schleife innerhalb der geben, die ich gegeben habe. korrigiere mich wenn falsch? – gagneet

+0

Es tut mir leid, ich verstehe es immer noch nicht richtig, denke ich. Was ich verstehe, ist, dass du ** etwas Arbeit ** machen willst (ich weiß nicht genau was) und es unter einer vorgesehenen Anzahl von Threads verteilen. Diese Arbeit scheint nbLines Aufrufe der getTime Funktion zu sein, aber ich bin mir nicht sicher. Und ich weiß nicht, wie Sie nbLines in all dem verwenden wollen. Bitte versuchen Sie genauer zu sein! –

+0

Ich habe die Hauptfrage bearbeitet. Informiere dich, wenn die Anforderung noch unklar ist. – gagneet

1

Wie wäre es mit etwas wie OpenMP? Wenn Skalierbarkeit Ihr Ziel ist, ist es wahrscheinlich eine bessere Wahl.

Verwandte Themen