C++ paralelizmus a vypisy

Programovacie jazyky, rady, poradňa...
Kvietok
Amateur
Amateur
Používateľov profilový obrázok
Príspevky: 30
Registrovaný: 18 apr 2012, 23:32

C++ paralelizmus a vypisy

Príspevok od používateľa Kvietok »

Ahojte, mam taku otazku. Vsimam si, ze ak pouzivam v kode paralelizmus, v ktorom realizujem aj vypisy (cout), vznika problem s tym, ze tie vypisy su vseliako pohadzane (hlavne riadky). Cim to je? Zavisi to od toho, ktore vlakno sa zacne spracovavat skor? Je mozne to nejako riesit, aby sa to nestavalo?
harrison314
Hardcore addict
Hardcore addict
Používateľov profilový obrázok
Príspevky: 8223
Registrovaný: 27 máj 2009, 20:42
Bydlisko: Bratislava
Kontaktovať používateľa:

Re: C++ paralelizmus a vypisy

Príspevok od používateľa harrison314 »

Je to buffrovanim stdout, treba flush-ovat a synchronizovat.

//autoeditácia príspevku (25 Apr 2012, 17:00)
A neodporucam vypisovat v thredoch, ono sa to robi iba pri uceni.
Kvietok
Amateur
Amateur
Používateľov profilový obrázok
Príspevky: 30
Registrovaný: 18 apr 2012, 23:32

Re: C++ paralelizmus a vypisy

Príspevok od používateľa Kvietok »

Ako to flush-ovanie a synchronizaciu mozem dosiahnut v pripade vlakien?

Ok, skusala som aj nevypisovat priamo vo vlaknach, ale len vo funkcii (ta poskytuje vypis vysledku vypoctu), ktora je nimi viacnasobne zavolana pri kazdej instancii zvlast. Obdobne problem, mozno tak obcas sa zjednoti na tom, ze ich bude citat zdola nahor. Pouzivam pri tom parallel_invoke.
harrison314
Hardcore addict
Hardcore addict
Používateľov profilový obrázok
Príspevky: 8223
Registrovaný: 27 máj 2009, 20:42
Bydlisko: Bratislava
Kontaktovať používateľa:

Re: C++ paralelizmus a vypisy

Príspevok od používateľa harrison314 »

flushovanie cout.flush()
synchronyzacia: mutexi,semafory, condition variables, bariery, turnyket, ... tych prostredkov je vela ale su si navzajom ekvivalntne

To vypysovanie som myslel tak, ze vetcino pri paralelizacii uloh sa nerobý vstup a výstup vo vláknach ale udaje sa vo vnutri medzi vlaknymi odovzdavaju od hlavneho vlakna, pozri si klasicke synchronyzacne problemi producenti-konzumeti, readres/writers.

Radcej ukaz kod, lebo mne sa to velmi nezda :smt017 .
A len taka poznamka, pri OpenMP je ovela lacnejsia paralelizacia v C/C++ ako z cistymi thredmi.
juraj++
Medium Expert
Medium Expert
Príspevky: 105
Registrovaný: 10 okt 2006, 21:54

Re: C++ paralelizmus a vypisy

Príspevok od používateľa juraj++ »

no ak mas viac vlakien bude to fuska, ja by som to riesil mutexom, natoto sa hodi
johny3212
Star
Star
Používateľov profilový obrázok
Príspevky: 532
Registrovaný: 17 feb 2008, 19:56
Bydlisko: Terchova
Kontaktovať používateľa:

Re: C++ paralelizmus a vypisy

Príspevok od používateľa johny3212 »

Staci ti vlakna raz globalne zabespecit mutexom a mas vystarane s prepisovanim dat. Ak to neosetris, ti bude padat soft a ty nebudes ani vediet preco :). Potrebujes aj casovac.
Ale pozor: mutex ti nezabespecuje uplnu synchronizaciu. Ten je iba na to, aby ti vlakna na raz nesahali do jednej pamate. Ak chces aby ti jedno vlakno cakalo na pracu druheho, na to su ine veci, napriklad vlastna stavova premenna alebo pouzi condition variables (vtedy ti moze odpadnut casovac).

Ja ti odporucem pouzit boost thread a mutex alebo standardne std (ale s C++0x).

http://www.boost.org/doc/libs/1_49_0/do ... hread.html
http://www.boost.org/doc/libs/1_49_0/do ... ms.mutexes

Pri vlaknach ti neodporucam pouzivat funkcnost z viac kniznic. Teda ak pouzijes boost vlakna, treba aj boost mutex a boost time, pre uplnu kompatibilitu.
Napísať odpoveď