Prosty program z 2-oma wątkami
Ostatnio zmodyfikowano 2016-03-31 16:45
mrci Temat założony przez niniejszego użytkownika |
Prosty program z 2-oma wątkami » 2016-03-31 14:04:43 Cześć Napisałem prosty programik, który co 5 sec zwiększa liczbę o 1. #include <iostream> #include <ctime> using namespace std;
int main() { int liczba = 0; while( true ) { cout << liczba << endl; liczba++; time_t start, stop; time( & start ); stop = start; while( difftime( stop, start ) < 5 ) { time( & stop ); } } }
Chciałbym usprawdzić ten program o dwa wątki. Jeden, który w tle zajmował by się zwiększaniem tej liczby o 1 i drugi, który odpowiadał by za wyswietlenie aktualnej wartości po wpisaniu tekstu "wyswietl". Przykładowy output: wyswietl //wpisanie komendy w pierwszych 5 sekundach 0 wyswietl //wpisanie komendy po 20 sekundach 4 Z góry dzięki za pomocne rady :) |
|
mokrowski |
» 2016-03-31 15:42:56 #include <iostream> #include <string> #include <thread> #include <atomic> #include <chrono>
using namespace std;
void inc_worker( atomic < unsigned >& count, volatile bool & running ) { while( running ) { atomic_fetch_add( & count, 1U ); std::this_thread::sleep_for( std::chrono::seconds( 5 ) ); } }
void cmd_loop( atomic < unsigned >& count, volatile bool & running ) { string cmd_str = ""; cout << "Podaj jedno z poleceń:\n" " koniec - kończy działanie programu\n" " wyświetl - wyświeta stan licznika\n"; while( cmd_str != "koniec" ) { cout << "CMD> "; cin >> cmd_str; if( cmd_str == "wyświetl" ) { cout << "Stan licznika: " << atomic_load( & count ) << endl; } else { cerr << "Komenda nieznana: " << cmd_str << endl; } } cout << "Koniec działania programu." << endl; running = false; }
int main() { volatile bool running = true; atomic < unsigned > counter = ATOMIC_VAR_INIT( 0 ); auto inc_thr = thread( & inc_worker, ref( counter ), ref( running ) ); cmd_loop( counter, running ); cout << "Oczekiwanie na zakończenie wątku." << endl; inc_thr.join(); }
|
|
Monika90 |
» 2016-03-31 15:54:02 Niestety, niezdefiniowane zachowanie - data race na zmiennej running. |
|
mokrowski |
» 2016-03-31 16:03:48 Świadomie "olałem" bo w 1 jest wyłącznie czytana a w drugim zapisywana :-) Jak będzie chciał zastosuje atomic_bool. Z drugiej strony 5 sek. i flaga... :-/ lepiej zrobić czymś innym. No ew. volatile dodać :-) |
|
Monika90 |
» 2016-03-31 16:27:36 Nie, nie volatile, teraz jest jeszcze gorzej.
No i w ogóle po co wątki do czegoś takiego?
|
|
mokrowski |
» 2016-03-31 16:45:20 Po co? Bo pewnie "kazali" :-/ Bo sensu nie ma (także się zgadzam). Ot "fistaszek" i tyle... Do czytania atomic_load, atomic_store i Memory model... |
|
« 1 » |