POSIX – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

POSIX – C / C++ – Fórum – Programujte.comPOSIX – C / C++ – Fórum – Programujte.com

 

Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
Midnight
~ Anonymní uživatel
78 příspěvků
11. 6. 2011   #1
-
0
-

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.

Nahlásit jako SPAM
IP: 92.62.224.–
Reklama
Reklama
m->29+6
Super člen
11. 6. 2011   #2
-
0
-

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ť.

Nahlásit jako SPAM
IP: 83.240.51.–
Midnight
~ Anonymní uživatel
78 příspěvků
11. 6. 2011   #3
-
0
-

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 ( );
}

Nahlásit jako SPAM
IP: 92.62.224.–
nervak0
Věrný člen
11. 6. 2011   #4
-
0
-

Víc popiš, co s těmi daty chceš dělat a ukaž, jak to teď děláš.

Nahlásit jako SPAM
IP: 213.211.51.–
m->29+6
Super člen
11. 6. 2011   #5
-
0
-

Skôr som myslel kód s ukážkou ako ten vektor vytvoríš (funkcia loadVector ho len naplní), pošleš do vlákna a ako ho vo vlákne spracovávaš.

Nahlásit jako SPAM
IP: 83.240.51.–
Anonymní uživatel
~ Anonymní uživatel
0 příspěvků
11. 6. 2011   #6
-
0
-

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.

Nahlásit jako SPAM
IP: 92.62.224.–
KIIV+42
God of flame
11. 6. 2011   #7
-
0
-

To Anonymní uživatel : no kazdopadne nevytvaris novej clanek fronty... a taky by sis pri takovy akci mel celou frontu zamknout mutexem

Nahlásit jako SPAM
IP: 94.142.234.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Midnight
~ Anonymní uživatel
78 příspěvků
11. 6. 2011   #8
-
0
-

Tak samozřejmě jsem z funkce vysekal pro přehlednost všechen balast, co se netýkal mého problému s vectorem. To "//neco" znamená, že tam něco chybí.

Nebo nevím, co jsi tím myslel.

Nahlásit jako SPAM
IP: 92.62.224.–
KIIV+42
God of flame
11. 6. 2011   #9
-
0
-

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)

Nahlásit jako SPAM
IP: 94.142.234.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Midnight
~ Anonymní uživatel
78 příspěvků
11. 6. 2011   #10
-
0
-

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.

Nahlásit jako SPAM
IP: 92.62.224.–
KIIV+42
God of flame
11. 6. 2011   #11
-
0
-

To Midnight : na co tam mas pak proboha ten vector?

Nahlásit jako SPAM
IP: 94.142.234.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Midnight
~ Anonymní uživatel
78 příspěvků
11. 6. 2011   #12
-
0
-

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.

Nahlásit jako SPAM
IP: 92.62.224.–
KIIV+42
God of flame
11. 6. 2011   #13
-
0
-

To Midnight : na to bych spis pouzil mapu

Nahlásit jako SPAM
IP: 94.142.234.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Midnight
~ Anonymní uživatel
78 příspěvků
11. 6. 2011   #14
-
0
-

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.

Nahlásit jako SPAM
IP: 92.62.224.–
KIIV+42
God of flame
11. 6. 2011   #15
-
0
-

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

Nahlásit jako SPAM
IP: 94.142.234.–
Program vždy dělá to co naprogramujete, ne to co chcete...
crAzY^
~ Moderátor
+10
Grafoman
11. 6. 2011   #16
-
0
-

To KIIV : jojo, kyoto jsou velice zajímavé knihovny... také jsem je párkrát použil... a v tomto případě by byli ideální, rozhodně lepší než vector

Nahlásit jako SPAM
IP: 89.190.90.–
All you need is vision and time.
Midnight
~ Anonymní uživatel
78 příspěvků
12. 6. 2011   #17
-
0
-

Koukám na to a asi použiju tu mapu, přeci jenom se mi to zdá pochopitelnější, než co jsem našel o kyotu. Nebo se mýlím? A složitost vyhledávání prvků v mapě je logaritmická, což docela hustý :-)

Nahlásit jako SPAM
IP: 92.62.224.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 115 hostů

Podobná vlákna

Posix vlakna — založil ivan

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032016 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý