Zmienna globalne przy multithreadingu - dlaczego wątki nie nadpisują zmiennej?

0

Ogladajac odcinek o multithreadingu :
pojawil mi sie taki problem :

 
#include <iostream>
#include <windows.h>
//__thread
//TUTAJ NIE ROZNICY W WYNIKACH!!!
int x;
DWORD __stdcall MyProc(void *param)
{
    x = (int)param;
    std::cout<<(int)param<<" ("<<GetCurrentThreadId()<<")\n";
    Sleep(1000);
    std::cout<<(int)param<<" ("<<GetCurrentThreadId()<<")\n";
    return 0;
}
int main()
{
    std::cout<<"Start\n";
    HANDLE h[2] = {
    CreateThread(0, 0, MyProc, (void *)1, 0, 0),
    CreateThread(0, 0, MyProc, (void *)2, 0, 0)
    };
    WaitForMultipleObjects(2, h, true, INFINITE);
    std::cout<<"Stop\n";
    return 0;
}

Zmienna x nie jest nadpisywana przez watki. tak jakby __thread nie ma wplywu na wyniki, a powinno.
DLaczego watki nie nadpisuja sobie tej zmiennej globalnej?

Przykladowy wynik:
1 (13936)
2 (6064)
1 (13936)
2 (6064)

0
SIRKOLPOL napisał(a):

DLaczego watki nie nadpisuja sobie tej zmiennej globalnej?
A kto ci powiedział że nie nadpisują? Nadpisują jak najbardziej.

0

moj blad ;(
tutaj jak cos:
std::cout<<(int)x<<" zamiast param
dzieki;)

0

Ten odcinek jest już nieco przestarzały. Zapoznaj się z std::thread.
Twój program w nowym stylu:

#include<thread>
#include<mutex>
#include<iostream>
#include<chrono>
int x;
std::mutex globalMutex;
void MyProc(int param)
{
    globalMutex.lock();
    x = param;
    globalMutex.unlock();
    std::cout<<param<<" "<<std::this_thread::get_id()<<std::endl;
    std::this_thread::sleep_for(std::chrono::milliseconds(1000));
    std::cout<<param<<" "<<std::this_thread::get_id()<<std::endl;
}
int main()
{
    std::thread t1(MyProc, 5);
    std::thread t2(MyProc, 6);
    t1.join();
    t2.join();
    std::cout<<"x = "<<x<<std::endl;

    std::cin.sync();
    std::cin.get();
    return 0;
} 

1 użytkowników online, w tym zalogowanych: 0, gości: 1