C++ paralelizmus a vypisy
C++ paralelizmus a vypisy
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
- Príspevky: 8223
- Registrovaný: 27 máj 2009, 20:42
- Bydlisko: Bratislava
- Kontaktovať používateľa:
Re: C++ paralelizmus a vypisy
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.
//autoeditácia príspevku (25 Apr 2012, 17:00)
A neodporucam vypisovat v thredoch, ono sa to robi iba pri uceni.
Re: C++ paralelizmus a vypisy
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.
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
- Príspevky: 8223
- Registrovaný: 27 máj 2009, 20:42
- Bydlisko: Bratislava
- Kontaktovať používateľa:
Re: C++ paralelizmus a vypisy
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
.
A len taka poznamka, pri OpenMP je ovela lacnejsia paralelizacia v C/C++ ako z cistymi thredmi.
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
A len taka poznamka, pri OpenMP je ovela lacnejsia paralelizacia v C/C++ ako z cistymi thredmi.
Re: C++ paralelizmus a vypisy
no ak mas viac vlakien bude to fuska, ja by som to riesil mutexom, natoto sa hodi
-
johny3212
Star
- Príspevky: 532
- Registrovaný: 17 feb 2008, 19:56
- Bydlisko: Terchova
- Kontaktovať používateľa:
Re: C++ paralelizmus a vypisy
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.
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.