Vlakna a Mutex

Programovacie jazyky, rady, poradňa...
johny3212
Star
Star
Používateľov profilový obrázok
Príspevky: 532
Registrovaný: 17 feb 2008, 19:56
Bydlisko: Terchova
Kontaktovať používateľa:

Vlakna a Mutex

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

Cavte, mam taku otazku. C++
Mam zakladny beh aplikacie a z neho vytvaram vlakna (boost::thread), tam bezi (USB kamera, AVI player, RS232 virtual port). Problem vysvetlim na objekte std::cout . Jedna sa o staticky objekt, globalne deklarovany, ktory pouziva pretazny operator << ; Takto

Kód: Vybrať všetko

cout << "vypis" << premenna;
si robim vypisovanie v konzole, objekt std::cout sa ale moze volat pre vypis bud z hlavnej aplikacie alebo z vlaknien. Podla vas je nutne kazde volanie objektu std::cout << nieco; uzamikat mutexom (boost::mutex)? Lebo mi aplikacia pada po par dnoch a neviem, ci to moze byt tym, ze saham v rovnakom case z roznych vlakien do rovnakej pamate objektu std::cout; . Dik za radu :).
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: Vlakna a Mutex

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

Pokial viem cout neni thread safe, ale jeho nespravne pouzite vo viacerych vlaknach mi nerobili problemi, sle skus nieco taketo

Kód: Vybrať všetko

 mutex_lock();
 std::cout<<daco<<ecndl;
 std::cout.flush(); // toto je nutne !
 multex_unlock();
metthal
Guru wannabe
Guru wannabe
Používateľov profilový obrázok
Príspevky: 2475
Registrovaný: 26 jan 2006, 18:32
Bydlisko: Nitra / Brno

Re: Vlakna a Mutex

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

Dlho som v jednej mojej aplikacii pouzival cout bez mutexov, crash som nikdy nedostal, jedine co som obcas videl, bolo ze sa vypisali 2 rozne volanie cout-u do jedneho riadku, popripade sa tam este aj pomiesali znaky. Neskor som tam vsak pridal ten kod, ktory ti prave poslal harrison a vsetko bolo v poriadku. Takze ja osobne by som chranil vypis mutexom. Avsak pricinu crashu by som hladal inde.
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: Vlakna a Mutex

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

A ako dlho si mal pustenu aplikaciu s vlaknami? Mne to ide aj 4 dni vkuse a potom to padne. Toto

Kód: Vybrať všetko

std::cout.flush(); // toto je nutne !
treba dat vo vlakne po kazdom vypise, alebo staci iba na koniec vlaknoveho cyklu raz?
Ale vidim to tak, ze z realtime dam vsetky vypisi von, lebo nie je mozne pre mna ustrazit std::cout; kadze robim team work :). Skusim pouzit a ustrazit logovaci system na HDD.
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: Vlakna a Mutex

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

johny3212 napísal:A ako dlho si mal pustenu aplikaciu s vlaknami? Mne to ide aj 4 dni vkuse a potom to padne. Toto

Kód: Vybrať všetko

std::cout.flush(); // toto je nutne !
treba dat vo vlakne po kazdom vypise, alebo staci iba na koniec vlaknoveho cyklu raz?
Ono je to koli tomu aby boli riadky vypisane v spravnom poradi (chronologicky) , bez toho sa mi stavalo, ze vypis ktory sa mal vypisat pred dvoma sekundami sa objavil az po nejakom co mal byt o dve sekundy neskor.
Ak to chce vypisovat z cyklu asi by bolo jednoduchsie pouzit stringstream a ten potom vypisat naraz.
metthal
Guru wannabe
Guru wannabe
Používateľov profilový obrázok
Príspevky: 2475
Registrovaný: 26 jan 2006, 18:32
Bydlisko: Nitra / Brno

Re: Vlakna a Mutex

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

Ja som to v takych extremoch nemal, ze 4 dni. Maximalne to chodilo tak 8 hodin denne. Ak to mas vsak zbuildene v debugu tak skus sem hodit backtrace z gdb ked to padlo. Mozno sa tam nieco najde.
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: Vlakna a Mutex

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

Ano, ja to testujem ako produkt na druhom PC, kde to je pustene v release mode bez ID. Musim tam nainstalovat Eclipse a spustit soft v Debug mode a cakat :). Mam aj logovaci system, ale tieto chyby sa strasne zle hladaju a riesia :).
Napísať odpoveď