<future> nötig oder nicht

  • Ich habe im Code von Skin flatPlus mehrere Stellen , wo Timer abgefragt werden. Beispiel:

    Aber ein mal auch das:

    Code
                // Look for timers
                auto recCounterFuture = std::async([&NumRec]() {
                    LOCK_TIMERS_READ;  // Creates local const cTimers *Timers
                    for (const cTimer *ti = Timers->First(); ti; ti = Timers->Next(ti)) {
                        if (ti->HasFlags(tfRecording))
                            ++NumRec;
                    }
                });
                recCounterFuture.get();
                if (NumRec) {

    Bracht man das async zeugs? Ich verstehe den Nutzen in dem Fall nicht.

    Kanallogos: Picon.cz2VDR | Picons2VDR | MP-Logos
    Backupskripte:
    MV_Backup (RSync) | MV_BorgBackup (Borg)

    Skin: Skin FlatPlus  VDR-Add_MSGT

    "Es gibt keinen Grund, warum irgendjemand einen Computer in seinem Haus wollen würde."
    [Ken Olson], Präsident der Digital Equipment Corp., 1977

    VDR01 - yaVDR 0.7 (VDR 2.7.3)

    VDR 2.7.3; Gehäuse: Antec Fusion V2 Black & iMon LCD; Atric IR-Einschalter Rev. 4; Board: Intel DH77EB, Core i5-3550, GTX 1050 Ti, 8 GB RAM; DVB: 1x Digital Devices CineS2 Quad V6.5

    >Systeminfo.txt< [VDR-User #1540]

  • Jemand hat wohl damit versucht zu erreichen, in der Variable NumRec die Anzahl aktiver Timer mit weiteren Threads zu ermitteln, und zwar so, dass die Anzahl in der Variable steht, noch bevor der restliche Code aufgerufen wird.

    Sobald die Lambda Funktion durchgelaufen ist, wird im Rückgabe std::future ein Flag gesetzt. get() wartet dann solange im aktuellen thread bis das Ergebnis da ist.

    Geht wohl um Geschwindigkeit..

    Display Spoiler
    Display Spoiler
    Display Spoiler
    Display Spoiler
    Display Spoiler
    Display Spoiler
    Display Spoiler
    Display Spoiler
    Display Spoiler
    Display Spoiler
    Display Spoiler
    Display Spoiler
    Display Spoiler
    Display Spoiler
    Display Spoiler


    to spoil
    verderben
    beschädigen
    plündern
    behindern
    berauben
    vereiteln
    rauben
    zerstören [fig.] [verderben, verunstalten]
    vergällen
    verhageln [fig.]

  • Aber mit gleich danach den get() call, bringt doch keinen Geschwindigkeitsvorteil.

    Vielleicht wollte man damit einen invalid lock sequence vermeiden, indem man den Lock in einen eigenen Thread gepackt hat ?

    VDR

    Server: Ubuntu 24.04 headless VDR im LXC Container, Plugins: satip (Octopus NET SL SX8), live, epgsearch, tvscraper, markad

    Clients: LibreELEC auf RasPi3 und RasPi 3+

  • So weit ich das als Laie sehe, ist die baserender.c nicht in einem eigenen Threat und es ist auch die einzige Stelle im Code.

    Vielleicht wollte man damals so was einbauen, hat aber nicht weiter gemacht? Ich kann das sicher deaktivieren, oder?

    https://github.com/MegaV0lt/vdr-p…serender.c#L447

    Kanallogos: Picon.cz2VDR | Picons2VDR | MP-Logos
    Backupskripte:
    MV_Backup (RSync) | MV_BorgBackup (Borg)

    Skin: Skin FlatPlus  VDR-Add_MSGT

    "Es gibt keinen Grund, warum irgendjemand einen Computer in seinem Haus wollen würde."
    [Ken Olson], Präsident der Digital Equipment Corp., 1977

    VDR01 - yaVDR 0.7 (VDR 2.7.3)

    VDR 2.7.3; Gehäuse: Antec Fusion V2 Black & iMon LCD; Atric IR-Einschalter Rev. 4; Board: Intel DH77EB, Core i5-3550, GTX 1050 Ti, 8 GB RAM; DVB: 1x Digital Devices CineS2 Quad V6.5

    >Systeminfo.txt< [VDR-User #1540]

  • Es ist eine synchronisation zwischen mehreren threads, ob das auch nützlich ist, kann man nur verstehen wenn man im Code gräbt.

    Display Spoiler
    Display Spoiler
    Display Spoiler
    Display Spoiler
    Display Spoiler
    Display Spoiler
    Display Spoiler
    Display Spoiler
    Display Spoiler
    Display Spoiler
    Display Spoiler
    Display Spoiler
    Display Spoiler
    Display Spoiler
    Display Spoiler


    to spoil
    verderben
    beschädigen
    plündern
    behindern
    berauben
    vereiteln
    rauben
    zerstören [fig.] [verderben, verunstalten]
    vergällen
    verhageln [fig.]

  • Vielleicht wollte man damit einen invalid lock sequence vermeiden, indem man den Lock in einen eigenen Thread gepackt hat ?

    Ich denke das ist es. :tup

    Kanallogos: Picon.cz2VDR | Picons2VDR | MP-Logos
    Backupskripte:
    MV_Backup (RSync) | MV_BorgBackup (Borg)

    Skin: Skin FlatPlus  VDR-Add_MSGT

    "Es gibt keinen Grund, warum irgendjemand einen Computer in seinem Haus wollen würde."
    [Ken Olson], Präsident der Digital Equipment Corp., 1977

    VDR01 - yaVDR 0.7 (VDR 2.7.3)

    VDR 2.7.3; Gehäuse: Antec Fusion V2 Black & iMon LCD; Atric IR-Einschalter Rev. 4; Board: Intel DH77EB, Core i5-3550, GTX 1050 Ti, 8 GB RAM; DVB: 1x Digital Devices CineS2 Quad V6.5

    >Systeminfo.txt< [VDR-User #1540]

  • > Vielleicht wollte man damit einen invalid lock sequence vermeiden, indem man den Lock in einen eigenen Thread gepackt hat ?

    Und dann noch auf den anderen Thread warten ...-> deadlock, der aber keine invalid lock sequence auslöst. "Denn sie wissen nicht, was sie tun".

  • Hast natürlich Recht, macht so keinen Sinn. Besser wäre es die Lock Reihenfolge zu korrigieren.

    Aber solange im aufrufenden Thread kein LOCK_TIMERS_WRITE drin ist, wird der LOCK_TIMERS_READ immer irgendwann erfolgreich sein.

    VDR

    Server: Ubuntu 24.04 headless VDR im LXC Container, Plugins: satip (Octopus NET SL SX8), live, epgsearch, tvscraper, markad

    Clients: LibreELEC auf RasPi3 und RasPi 3+

  • Da ist guter Rat teuer. Das mit dem async ist also nicht die beste Idee...

    Das in den Flush() zu verschieben würde das überhaupt was ändern?

    TopBarUpdate() wird ja in Flush https://github.com/MegaV0lt/vdr-p…laymenu.c#L3520 aufgerufen

    Code
    void cFlatDisplayMenu::Flush() {
        if (!MenuPixmap) return;
        TopBarUpdate();
    ...

    Und in TopBarUpdate() https://github.com/MegaV0lt/vdr-p…serender.c#L307 ist die Abfrage drin:

    Code
            if (Config.TopBarRecordingShow) {
                auto RecCounterFuture = std::async(std::launch::async, [&NumRec]() {
                    LOCK_TIMERS_READ;  // Creates local const cTimers *Timers
                    for (const cTimer *Timer = Timers->First(); Timer; Timer = Timers->Next(Timer)) {
                        if (Timer->HasFlags(tfRecording))
                            ++NumRec;
                    }
                });
                RecCounterFuture.get();
    ...


    Edit: Wäre schön, wenn man die Werte auch einfacher vom VDR bekommen könnte (z.B. TimerRecording, TimerActive, Timers)

    Kanallogos: Picon.cz2VDR | Picons2VDR | MP-Logos
    Backupskripte:
    MV_Backup (RSync) | MV_BorgBackup (Borg)

    Skin: Skin FlatPlus  VDR-Add_MSGT

    "Es gibt keinen Grund, warum irgendjemand einen Computer in seinem Haus wollen würde."
    [Ken Olson], Präsident der Digital Equipment Corp., 1977

    VDR01 - yaVDR 0.7 (VDR 2.7.3)

    VDR 2.7.3; Gehäuse: Antec Fusion V2 Black & iMon LCD; Atric IR-Einschalter Rev. 4; Board: Intel DH77EB, Core i5-3550, GTX 1050 Ti, 8 GB RAM; DVB: 1x Digital Devices CineS2 Quad V6.5

    >Systeminfo.txt< [VDR-User #1540]

Participate now!

Don’t have an account yet? Register yourself now and be a part of our community!