Zdravím!
Řeším takový malý problém za použití POSIXových vláken, který se podobá modelu producent/konzument. Producent mi přidává do fronty data reprezentovaná strukturou, kde jsou všechny informace potřebné pro konzumenty.
Problém je v tom, že mám nějaká data, kterých není zrovna málo uložena ve vectoru ( nemohu si dovolit je pokazde kopirovat ), tak se chci zeptat, jak byste řešili předávání těchto dat vláknům.
Potřebuji, aby to vypadalo nějak takto
struct node
{
//promenne, ktere vzdy zkopiruji
//muj vector
node *next;
};
Napadlo mě předat referenci na můj vector a následně ve vláknech dereferencovat, ale to mi nefunguje.
S STL zkušenosti nemám skoro vůbec, sotva zvládám metodu push_back ( ) ( no to zase ne :) ), takže probém bude nejspíše tam.
Předem děkuji za každou pomoc.
Fórum › C / C++
POSIX
Ono to záleží aj na tom, ako ten vektor alokuješ. Pri najhoršom sa dá použiť zdieľaná pamäť funkcie shmget(), ... ale myslím, že vlákna majú všetko spoločné okrem zásobníku a registrov tak by to nemal byť problém. Pomohol by dotyčný kus kódu ak ho môžeš zverejniť.
Sdílet paměť právě nepotřebuju, vlákna mají, jak říkáš, společný adresový prostor. Mohl bych to vyřešit globální proměnnou, ale to až v krajním případě.
Pokud myslíš kód, jak ten vektor alokuji, tak je to takto:
void loadVector ( vector<string> &v )
{
ifstream fin;
string input;
fin.open ( "outfile.txt" );
if ( !fin.is_open ( ) )
{
cout << "Nepodarilo se otevrit soubor.\n";
exit ( 1 );
}
while ( fin >> input && !fin.eof ( ) )
{
v.push_back ( input );
}
fin.close ( );
}
Vytvářím jej tedy na začátku mainu takto:
vector<string> words;
Moje struktura ve frontě vypadá takto:
struct queue
{
int b;
int e;
char toSeek[];
vector<string> *v;
queue *next;
};
Pak kritická je funkce, kde vytvářim další článek fronty:
void enqueue ( const int &b, const int &e, char toSeek[], vector<string> &v )
{
queue *node = new queue;
// neco
node->v = &v; //Toto bude kamen urazu
// neco
}
Jinak ve vlakne zatim nijak vector nezpracovavam, ale budu jej pouzivat pouze ke cteni, takze snad není třeba řešit.
da se to delat i tak ze mas jednu globalni frontu (nebo v mainu a predas referenci primo do vlakna..) mutex bys mel mit idealne globalni nebo nejak jinak pristupnej pro vsechny vlakna... a pak uz jen do ty jedny fronty pridavas polozky .. treba struktury (tj. zda se mi divne mit frontu uvnitr struktury a pak tam jeste pridavat na konec nejakou dalsi a tak dale)
No já frontu mám globální, mutexy a semafory samozřejmě taky.
Já jen řeším to, že jakmile budu potřebovat nějaká objemnější data v STL kontejnerech předávat vláknům, budu muset vytvořit globální proměnnou, místo přidání pouze adresy na tato data do položky ve frontě, kterou si ve vláknu dereferencuji, jak jsem se pokoušel nahoře.
Jinak s tou strukturou jsem to asi špatně vysvětlil, mám normálně frontu reprezentovanou spojovým seznamem za pomocí jedné struktury queue.
Načítám do něj ze souboru slovník všech českých slov :-D
Zvláštní, přiznávám, ale potřebuji stvořit věc, která mi ze zadaných písmen porovná všechny podřetězce všech permutací těchto písmen, jestli z nich nejde složit slovo v co nejrychlejším čase.
Co to prosím přesně mapa je? To jsem ještě asi ani neslyšel.
Idea mého řešení bylo seřadit si slovník ve vectoru primárně podle délky řetězce, poté podle abecedy a zjistit si na jaké pozici začínají jak dlouhá slova. A odtud začínat vyhledávat. Pokud první písmeno hledaného slova nekoresponduje se slovem v seznamu se kterým právě porovnávám, breaknu. Složitost prohledávání je poté asymptoticky pořád lineární, ale doopravdy se výrazně zlepší.
Program mám hotový pro jedno vlákno, teď jej právě jen potřebuji máknout pro více vláken, abych jej zase o něco zrychlil.
To Midnight : std::map alias slovnik... ale teoreticky by se dala pouzit nejaka vhodna databaze... treba v praci si hrajeme s kyoto cabinetem (a pripadne i s kyoto tycoonem jako databazovym serverem)
ma to pomerne rychle vyhledavani a tak.. na slovnik by to stacilo
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Posix vlakna — založil ivan
Moderátoři diskuze