Fórum Ubuntu CZ/SK

Ubuntu pro osobní počítače => Software => Příkazový řádek a programování pro GNU/Linux => Téma založeno: Firzen 19 Října 2011, 13:17:57

Název: Dynamický počet vláken s std::thread
Přispěvatel: Firzen 19 Října 2011, 13:17:57
Ahoj,

nemáte někdo zkušenosti s vytvářením vláken pomocí headeru thread? Umím vytvořit naprosto primitivní vlákno/a v podobě:
Kód: [Vybrat]
void funkce();

int main()
{
thread vl(funkce);
vl.join();
return 0;
}

void funkce()
{
cout << ".";
}
Tohle funguje normálně, ale to vl tam není vůbec ideální. Potřeboval bych vytvořit třeba 6 vláken, ve kterých bude běžet funkce() a to aniž bych je psal ručně, převdstavuju si něco jako:
Kód: [Vybrat]
vector<thread> vlakna;
for(int i=0; i<6; i++)
{
    vlakna.push_back(funkce);
    vlakna[i].join();
}

Ale toto prostě nelze zkompilovat (ani bez cyklu). Přitom toto by mělo být možné, a s každou jinou třídou kromě thread mi šlo použít vector (předpokládám, že to je šablona).
Proč tohle není možné?

A je možnost, jak udělat to co chci nějak jinak?
Díky moc.
Název: Re:Dynamický počet vláken s std::thread
Přispěvatel: Martin - ViPEr*CZ* 19 Října 2011, 15:35:18
Asi bych to dělal přes ukazatele. A todle určitě vyhazuje chybu: vlakna.push_back(funkce);

Spíš takhle:

Kód: [Vybrat]
vector<thread> vlakna;
thread vl(funkce);
vlakna.push_back(vl);

Ale radši bych to asi dělal přes ukazatele než staticky.
Název: Re:Dynamický počet vláken s std::thread
Přispěvatel: premet 20 Října 2011, 13:15:50
Tak jasný, že ti to háže chybu, když máš vector definovanej pro thread a chceš do něj házet ukazatele na funkci. Tohle budeš muset udělat jedině ručně.
Název: Re:Dynamický počet vláken s std::thread
Přispěvatel: Martin - ViPEr*CZ* 20 Října 2011, 13:40:40
Díky za doplnění... myslel jsem, že z toho co jsem psal to vyplynulo. Ostatně ten příklad hned pod tím by měl fungovat. Do vectoru posílám už instanci třídy vector, i když bych tam raději viděl ukazetel, se kterým je samozřejmě více problémů, které se do budoucna vyplatí :-)