Ho cercato in C++ 0x discussioni e hanno questo codice:funzione di Filetto con passata dal vettore di riferimento è lento a partire
#include <vector>
#include <iostream>
#include <thread>
void TestFunc(const vector<int>& vVec)
{
cout << "in"<<endl;
}
int main()
{
int sizer = 400000000;
vector<int> vTest(sizer);
for(int f=0; f<sizer; f++)
vTest[f] = f;
cout << "V created." << endl;
thread one(TestFunc, vTest);
one.join();
}
Come si può vedere solo passa un vettore ad un filo. La cosa che non capisco è che c'è una pausa dopo che appare il messaggio "V creato". In origine questo (supponevo) era il vettore da copiare per l'uso nella funzione. Per fermarlo ho passato invece con un riferimento, ma questo non ha fatto differenza.
Il ritardo sembra essere proporzionale alla dimensione del vettore che indica che sta ancora copiando (o facendo qualcosa con l'array). Se provo lo stesso esperimento senza thread e richiama direttamente la funzione, il ritardo è lì quando si passa per valore ma non quando si passa per riferimento come mi aspettavo.
Ho provato lo stesso utilizzando i thread Boost anziché C++ 0x (anche se ho letto che sono molto simili) e ho ottenuto lo stesso risultato.
C'è qualche motivo per questo comportamento o mi sono perso qualcosa di assolutamente ovvio? Grazie.
Spiacente, inviato il codice di test errato. Corretto. Modifica: aggiunto include come richiesto.
compilato con: g ++ 44 -STD = C++ 0x -lpthread tester.cpp -o prova ... come ho GNU 4.4 installato a fianco del compilatore GNU standard che viene fornito con il mio Linux (CentOS) che non supporta C++ 11.
la parte più costosa del TestFunc è la traccia, non i parametri che passano. sembra che C++ 0x non supporti la creazione di thread – BruceAdi
@Mahesh: Su quale sistema? Questo è solo 400 milioni e si adatterà comodamente a un int a 32 bit. –
@BruceAdi: In C++ 11 i thread sono assegnati dallo standard e almeno gcc-4.6 li supporta e funzionano - li uso tutti i giorni. – hirschhornsalz