Thread safe Abarbeitung Array



  • Hallo zusammen,

    ich beschäftige mich gerade ein bisschen mit Threads und hätte da mal eine Frage:

    Ich habe eine Liste(Array) von definierten Strukturen. Diese möchte ich nun alle abarbeiten. Meine Lösung bisher ist, dass ich herausfinde, wieviele Prozessorkerne ich habe und dann einfach die Liste in entsprechende Blöcke aufteile und den n Threads zuweise. Das klappt soweit auch aber mir ist da in einem bestimmten Fall etwas negativ aufgefallen. Ich verteile die Arbeit auf 4 Threads und plötzlich sind die ersten 3 fertig und der letzte hat noch zu schufften. Nun will ich ja nicht auf den einen warten sondern dass sich alle Threads so lange beschäftigen bis die Liste durch ist und nicht bis jedes einzelen Paket abgearbeitet ist.

    Also umprogrammieren und da komme ich zu dem Punkt wo ich ratlos bin und euch fragen möchte:

    Selbe Liste wie vorher und selbe Anzahl von Threads AUßER, dass die Threads keine Pakete mehr bekommen sondern sich das nächte Paket alleine "ziehen".

    Global habe ich diesen Array:

    static PLZ *plzlist[plzlistsize];
    static int nächstes_element = 0;
    

    Nun werden alle Threads erstellt und lesen aus der globalen "nächstes_element" bis sie an das Ende erreichen.

    Und nun zur Frage: Muss ich "nächstes_element" als volatile deklarieren um das Thread safe zu machen(ich kenne mich nicht so mit volatile aus)?

    In dem Thread sieht das folgendermaßen aus:

    DWORD WINAPI Thread_Proc(LPVOID lpParameter)
    {
        int index = ++nächstes_element;
        plzlist[index] bla bla bla......
    }
    

    Kann man das so machen?



  • secondsun schrieb:

    Und nun zur Frage: Muss ich "nächstes_element" als volatile deklarieren um das Thread safe zu machen(ich kenne mich nicht so mit volatile aus)?

    Nein, volatile hilft dir hier nichts; dein Stichwort lautet Atomic Operation. Schau dir mal an, was InterlockedIncrement() für dich tun kann... 😉

    Btw: Für den Fall, dass du C++ verwendest, schau dir mal std::thread, std::atomic etc. an...



  • volatile ist fuer "unusal memory" und und hat erstmal nix mit Threads zu tun. Deswegen: Nein!



  • Super, so geht es:-) Danke


Anmelden zum Antworten