API Thread Synchronisation, irgendwas mach ich falsch.



  • Guten Tag,
    ich versuche mich zum ersten mal an Threads...das Thema habe ich immer
    gemieden aber irgendwie reizt es mich trotzdem.
    Ich teste eigentlich ein einfaches Beispiel und hatte mir als Ergebnis
    folgendes in der Konsole erhofft:

    Starting both Threads...
    0
    1
    2
    3
    4
    5
    Closing both Threads...

    Doch irgendwie habe ich einen Denk(Syntax)fehler und bekomme immer eine
    unsaubere Zahlenkette in der Konsole raus 😞

    Ich wäre für jede Hilfe dankbar ❤
    (Hatte zuerst mit Mutex dann mit Critical Section getestet, bei beiden das gleiche Problem)

    #include <Windows.h>
    #include <WindowsX.h>
    #include <stdio.h>
    #include <iostream>
    
    using namespace std;
    
    int fu = 0;
    //HANDLE mutex = CreateMutex(NULL, false, NULL);
    CRITICAL_SECTION crit;
    
    void thread_1()
    {
    	//WaitForSingleObject(mutex, INFINITE);
    	EnterCriticalSection(&crit);
    	cout << fu << endl;
    	LeaveCriticalSection(&crit);
    	//ReleaseMutex(mutex);
    }
    
    void thread_2()
    {
    	//WaitForSingleObject(mutex, INFINITE);
    	EnterCriticalSection(&crit);
    	fu++;
    	LeaveCriticalSection(&crit);
    	//ReleaseMutex(mutex);
    }
    
    int main()
    {
    	InitializeCriticalSection(&crit);
    
    	cout << "Starting both Threads..." << endl;
    
    	LPVOID func_id_1 = "1";
    	LPVOID func_id_2 = "2";
    
    	DWORD thread_id_1 = 1;
    	DWORD thread_id_2 = 2;
    
    	for(int i = 0; i < 5; i++)
    	{
    
    	HANDLE h_thread[1];
    
    	h_thread[0] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)thread_1, &func_id_1, 0, &thread_id_1);
    	h_thread[1] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)thread_2, &func_id_2, 0, &thread_id_2);
    
    	//WaitForSingleObject(h_thread[0], INFINITE);
    	//WaitForSingleObject(h_thread[1], INFINITE);
    	WaitForMultipleObjects(2, h_thread, true, INFINITE);
    
    	CloseHandle(h_thread[0]);
    	CloseHandle(h_thread[1]);
    
    	}
    	cout << "Closed both Threads..." << endl;
    
    	DeleteCriticalSection(&crit);
    	//CloseHandle(mutex);
    	Sleep(5000);
    	return 0;
    }
    


  • Mit der Critical Section stellst du nur sicher, dass die Threads nicht gleichzeitig auf die Konsole schreiben. Die Reihenfolge in der sie das tun ist aber völlig zufällig.



  • Auf den ersten Blick...

    ChrisCross+ schrieb:

    ...und hatte mir als Ergebnis
    folgendes in der Konsole erhofft:

    Wie das? Du kannst nicht steuern, welcher Thread zuerst abgearbeitet wird. Es kann also sein, dass thread2 zuerst ausgeführt wird und somit auch zuerst die CS bekommt.

    Und ein Fehler: HANDLE h_thread[2];



  • Gibt es also keine Moeglichkeit die Reihenfolge zu kontrollieren mit der die Threads auf die Variable zugreifen?
    Vielen Dank fuer eure Antworten 🙂



  • Doch, z.B. mit Events (CreateEvent)


  • Mod

    ChrisCross+ schrieb:

    Gibt es also keine Moeglichkeit die Reihenfolge zu kontrollieren mit der die Threads auf die Variable zugreifen?
    Vielen Dank fuer eure Antworten 🙂

    Nein!
    Wenn Du das willst müsstest Du selbst eine Queue aufbauen und dann in diesen die entsprechenden Events signalisieren...



  • Ah das mit den Events ist ziemlich gut 😃
    Vielen Dank an Alle ❤


Anmelden zum Antworten