Hoi allemaal,
Ik ben bezig met het maken van een kleine library, en kom een aantal threading-problemen tegen. Er communiceren twee threads met mijn library:
1) event thread: deze thread geeft library aan welke events er gebeuren in het systeem
2) user/API thread: de gebruiker roept API functies op uit zijn eigen thread
Laat ik het heel simpel voorstellen:
Beide functies maken dus gebruik van shared data. Mijn vraag is nu: hoe kan ik deze shared data het beste afschermen? In feite kan ik simpel bij elke event- en API-functie een mutex aanvragen, en weer vrijgeven bij het einde van deze functie. Mij lijkt dit geen goede oplossing, wegens de overhead van het locken en vrijgeven van de mutex.
Daarom dacht ik extra thread bovenop de klasse Library te bouwen. Elke event die ik binnenkrijg post ik naar die thread, en elke API-functie-call post ik eveneens naar die thread. Op die manier moet ik mij in de eigenlijke implementatie van Library niet druk maken om threading issues, want hij wordt maar door die ene thread gebruikt:
Het probleem van deze aanpak is wel dat ik het moeilijk ga hebben met returnwaarden en excepties van API-functies. Ik zal waarschijnlijk voor elke API-functie een eigen klasse moeten aanmaken, dewelke de resultaten en excepties bevat, zodat ik deze terug kan gegeven aan de user.
Wat denken jullie? Bedankt!
Ik ben bezig met het maken van een kleine library, en kom een aantal threading-problemen tegen. Er communiceren twee threads met mijn library:
1) event thread: deze thread geeft library aan welke events er gebeuren in het systeem
2) user/API thread: de gebruiker roept API functies op uit zijn eigen thread
Laat ik het heel simpel voorstellen:
C++:
1
2
3
4
5
6
7
| class Library { shared data void EventFunction(); /* called by event thread */ void APIFunction(); /* called by API thread */ } |
Beide functies maken dus gebruik van shared data. Mijn vraag is nu: hoe kan ik deze shared data het beste afschermen? In feite kan ik simpel bij elke event- en API-functie een mutex aanvragen, en weer vrijgeven bij het einde van deze functie. Mij lijkt dit geen goede oplossing, wegens de overhead van het locken en vrijgeven van de mutex.
Daarom dacht ik extra thread bovenop de klasse Library te bouwen. Elke event die ik binnenkrijg post ik naar die thread, en elke API-functie-call post ik eveneens naar die thread. Op die manier moet ik mij in de eigenlijke implementatie van Library niet druk maken om threading issues, want hij wordt maar door die ene thread gebruikt:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
| class Library { public void EventFunction(Event); /* called by LibraryThreadSafe*/ public ReturnWaarde APIFunction(); /* called by LibraryThreadSafe */ } class LibraryThreadSafe : public Library { WaitQueue queue; public ReturnWaarde APIFunction() { queue.add(call van deze functie); wacht op resultaat return resultaat } public void EventFunction(Event e) { queue.add(e) } public void run() { while (queue.get()) verwerk } } |
Het probleem van deze aanpak is wel dat ik het moeilijk ga hebben met returnwaarden en excepties van API-functies. Ik zal waarschijnlijk voor elke API-functie een eigen klasse moeten aanmaken, dewelke de resultaten en excepties bevat, zodat ik deze terug kan gegeven aan de user.
Wat denken jullie? Bedankt!