Hirdetés

Új hozzászólás Aktív témák

  • BProgrammer

    lelkes újonc

    Sziasztok!

    Próbálgatom a párhuzamos programozást C++-ban és nem értem a következő működést:
    Elindítok 2 szálat, az egyiken 2000000000-szor növelgetek egy globális változót, a másikat 2 másodperces sleep-pel indítom majd egyszer csak beduplázom ugyanazt a változót konkurensen, miközben az increment még nem ért véget. Közben kiírogatom a dolgokat, ellenőrzöm a 2 másodperc sleep után még valóban nem ér véget az increment sose az én gépemen. Látszik is, hogy kb. beduplázódik a szám, valamikor a futás közben. Szóval azt várnám, hogy a legvégén, mire mindkét szál lefut, valami 2000000000-nál határozottan nagyobb szám lesz az eredmény minden esetben. Valamikor tényleg ez is van, de nagyon sokszor van, hogy pontosan 2000000000 az eredmény. De ez hogy lehet, hiszen nem akkor fut le soha a duplázás, mikor az n még 0 (ellenőrzöm a kiiratással). Arra is gondoltam, hogy hátha valami optimalizáció van, hogy valójában nem fut le 2000000000-szor a ciklus, hanem az i helyett magát a num-ot nézi, hogy ha az nagyobb, akkor kilép a ciklusból, de akkor meg máskor mér lehet nagyobb? Meg hát -O0 kapcsolóval is ugyanaz a probléma.

    Meg amit végképp nem értek, hogy egyszer volt olyan is, hogy nem duplázta be a számot, és a duplázás előtti és utáni kiíratás csak pár incrementálásban különbözött. Szóval eléggé össze vagyok zavarodva. Van ötletetek?

    Előre is köszi a válaszokat!

     
    #include <iostream>
    #include <thread>
    #include <chrono>

    using namespace std::chrono_literals;

    unsigned int num = 0;

    void increment()
    {
        std::cout<<"Starting increment "<< num << std::endl;
        for(int i=0; i<2000000000; ++i)
        {
                ++num;
        }
        std::cout<<"Ending increment "<< num << std::endl;
    }

    void doubler()
    {
        
        std::this_thread::sleep_for(2s);
        std::cout<<"Double starting " << num << std::endl;
        num*=2;
        std::cout<<"Double ending " << num << std::endl;
    }

    int main() {
        
        std::thread t1(increment);
        std::thread t2(doubler);

        t1.join();
        t2.join();
        
        std::cout << num << std::endl;
    }

Új hozzászólás Aktív témák