Kolejność wykonywania się wątków

0

Witam.

Znalazłem w sieci artykuł opisujący wątki w WINAPI. Wszystko fajnie, jednak przedstawiony tam poniższy kod:

#include <windows.h>
#include <conio.h>
#include <iostream>

using namespace std;

DWORD WINAPI watek_1(PVOID pvParam)
{
        cout << "To jest watek nr 1!\n";
    
    return 0;
}

DWORD WINAPI watek_2(PVOID pvParam)
{
        cout << "To jest watek nr 2!\n";
        return 0;
}

int main()
{
    HANDLE proces = GetCurrentProcess();
    SetPriorityClass(proces, ABOVE_NORMAL_PRIORITY_CLASS);
    
    

    DWORD watek1;
    HANDLE hWatek1 = CreateThread(NULL, 0, watek_1, NULL, 0, &watek1);

    SuspendThread(hWatek1);
        SetThreadPriority(hWatek1, THREAD_PRIORITY_BELOW_NORMAL);    // 
    ResumeThread(hWatek1);

    DWORD watek2;
    HANDLE hWatek2 = CreateThread(NULL, 0, watek_2, NULL, 0, &watek2);
    SuspendThread(hWatek2);
        SetThreadPriority(hWatek2, THREAD_PRIORITY_TIME_CRITICAL);    // 
    ResumeThread(hWatek2);
    
    HANDLE watekGlowny = GetCurrentThread();
    SetThreadPriority(watekGlowny, THREAD_PRIORITY_LOWEST);

    cout << "To jest watek glowny\n";

    system("PAUSE");
    return 0;
} 

zgodnie z tym co było wyjaśnione i zgodnie z moim zrozumieniem tematu powinien wykonać się w następującej kolejności:

watek2, watek1, watekglowny, jednak zachowanie programu jest nie determistyczne i wątki wykonują się w kolejności randomowej, kto pierwszy, ten lepszy ;)

Tak więc moje pytanie brzmi dlaczego priorytety wątków podane w SetThreadPrioryty() nie zmieniają kolejności wykonywania się wątków na 2, 1, główny.

Z góry dziękuję za pomoc.

2

Bo nigdzie nie jest powiedziane, że priorytety wątków zmieniają ich kolejność.
Zwłaszcza na maszynie wieloprocesorowej (wielordzeniowej) każdy wątek może ruszyć na innym rdzeniu.

Jak już zauważyłeś: wątki są niedeterministyczne.

0

Dziękuję za odpowiedź. Problem polega na tym, że w artykule z którego pochodzi podany przeze mnie przykład priorytety wątków miały właśnie zmienić ich kolejność wykonywania się :)
Problem polega pewnie w jakimś stopniu na tym, że artykuł pisany był w 2007 r, a mamy rok 2014 i faktycznie ja odpalałem ten program na maszynie wieloprocesorowej co jest dziś standardem.

Tak to w tej chwili ort!. Jeśli nie ma nic do dodania, to temat chyba można zamknąć. Jeszcze raz dziękuję za pomoc.

1

U mnie na jednordzeniowym procku (Celeron 220) rzeczywiście wynik jest taki:

To jest watek nr 2!
To jest watek nr 1!
To jest watek glowny
Aby kontynuować, naciśnij dowolny klawisz . . .

Ale nie można na tym polegać, bo przy obciążonym systemie wynik może się nagle okazać inny, nawet na tym samym komputerze.

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