In mijn C applicatie maak ik gebruik van een threadpool om met een beperkt aantal threads mijn functies af te handelen. Nu werken veel van die functies op basis van events. Echter zijn er ook functies die periodiek dienen plaats te vinden. De vraag is hoe je dit nu het beste implementeert. Er kunnen tientallen periodieke functies tegelijk aan het wachten zijn op uitvoering. Voorbeelden zijn:
- Elke drie seconden een cpu/ram gebruik opvraging.
- Elke zonsopgang / zonsondergang een event.
- Elke 24 uur een ntp-sync
- Elk uur een API aanvraag.
- Communiceren van de tijd via een klok functie.
Deze functies moeten ook afgehandeld worden door de threadpool. Nu heb ik dit op twee manieren proberen op te lossen van welke ik beide ontevreden was. In beide manieren stond dit stukje pseudocode centraal:
De time-based threads registreren zich in dit voorbeeld in een pool welke elke (milli)seconde doorgelopen wordt om te zien om er al voldoende tijd is verstreken om de functie uit te voeren. Nu heb ik deze functie dus op twee manieren proberen te integreren:
1. Voer de teller elke (milli)seconde uit vanuit een timer. Probleem is dat dit niet veilig is qua deadlocks. De timer wacht namelijk niet totdat de functie klaar is voordat hij opnieuw wordt aangeroepen.
2. Start een aparte thread met een loop welke elke seconde alle functies nagaat. Probleem hier is dat de evaluatie tijd teveel lacency teweeg brengt waardoor ik uiteindelijk (milli)seconden mis in mijn klok.
Ik zoek dus naar een manier om deze functionaliteit goed in te bedden in mijn bestaande threadpool structuur, maar wel met een hoge betrouwbaarheid, accuraatheid en snelheid. Idealiter behaal ik een resolutie van 1 milliseconde.
- Elke drie seconden een cpu/ram gebruik opvraging.
- Elke zonsopgang / zonsondergang een event.
- Elke 24 uur een ntp-sync
- Elk uur een API aanvraag.
- Communiceren van de tijd via een klok functie.
Deze functies moeten ook afgehandeld worden door de threadpool. Nu heb ik dit op twee manieren proberen op te lossen van welke ik beide ontevreden was. In beide manieren stond dit stukje pseudocode centraal:
code:
1
2
3
4
5
| func teller() { tik elke (milli)seconde (of wordt elke (milli)second aangeroepen) loop door periode threads als voldoende seconde gepasseerd, voer thread aan threadpool } |
De time-based threads registreren zich in dit voorbeeld in een pool welke elke (milli)seconde doorgelopen wordt om te zien om er al voldoende tijd is verstreken om de functie uit te voeren. Nu heb ik deze functie dus op twee manieren proberen te integreren:
1. Voer de teller elke (milli)seconde uit vanuit een timer. Probleem is dat dit niet veilig is qua deadlocks. De timer wacht namelijk niet totdat de functie klaar is voordat hij opnieuw wordt aangeroepen.
2. Start een aparte thread met een loop welke elke seconde alle functies nagaat. Probleem hier is dat de evaluatie tijd teveel lacency teweeg brengt waardoor ik uiteindelijk (milli)seconden mis in mijn klok.
Ik zoek dus naar een manier om deze functionaliteit goed in te bedden in mijn bestaande threadpool structuur, maar wel met een hoge betrouwbaarheid, accuraatheid en snelheid. Idealiter behaal ik een resolutie van 1 milliseconde.
Sinds de 2 dagen regel reageer ik hier niet meer