Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Prosty program z 2-oma wątkami

Ostatnio zmodyfikowano 2016-03-31 16:45
Autor Wiadomość
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.

C/C++
#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 :)
P-146817
mokrowski
» 2016-03-31 15:42:56
C/C++
#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();
}
P-146822
Monika90
» 2016-03-31 15:54:02
Niestety, niezdefiniowane zachowanie - data race na zmiennej running.
P-146823
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ć :-)
P-146824
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?
P-146826
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...
P-146827
« 1 »
  Strona 1 z 1