Hallo,
ik ben vandaag met een stukje code bezig geweest wat sterk lijkt op het zogenoemde consumer-producer pattern, ik denk de meeste wel bekend.
Wikipedia:
Nu is mijn probleem simpel, maar een mooie elegante oplossing heb ik nog niet gevonden, ik eindig steeds met 'vieze' hacks.
Doel: het stoppen van de consumer, op het moment dat deze niet meer nodig is.
Probleem: in de consumer is down(fillCount), uiteraard, blocking. Hoe kom ik ooit uit deze state als de producer al gestopt is? Merk op dat de producer in theorie 'oneindig' tijd nodig heeft om een een item voor de Buffer te produceren. Oplossingen met timeouts kunnen dus per definitie niet.
De enige 'mooie' oplossing die ik nu kan bedenken is een notification object in de Buffer te stoppen. De consumer leest deze als zijnde het ' stop'-signal en breakt uit zijn loop.
Handmatig de semaphore (in mijn geval is het geen semaphore, maar een blocking queue, dus gaat het ook moeilijker dan in het voorbeeld) 'uppen' als ik wil stoppen, en daarna niets uit de buffer lezen klinkt mij ook nogal vies in de oren.
Misschien zie ik iets heel eenvoudigs over het hoofd, maar op dit moment kom ik er gewoon even niet op...
Suggesties?
ik ben vandaag met een stukje code bezig geweest wat sterk lijkt op het zogenoemde consumer-producer pattern, ik denk de meeste wel bekend.
Wikipedia:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| semaphore fillCount = 0; // items produced semaphore emptyCount = BUFFER_SIZE; // remaining space procedure producer() { while (true) { item = produceItem(); down(emptyCount); putItemIntoBuffer(item); up(fillCount); } } procedure consumer() { while (true) { down(fillCount); item = removeItemFromBuffer(); up(emptyCount); consumeItem(item); } } |
Nu is mijn probleem simpel, maar een mooie elegante oplossing heb ik nog niet gevonden, ik eindig steeds met 'vieze' hacks.
Doel: het stoppen van de consumer, op het moment dat deze niet meer nodig is.
Probleem: in de consumer is down(fillCount), uiteraard, blocking. Hoe kom ik ooit uit deze state als de producer al gestopt is? Merk op dat de producer in theorie 'oneindig' tijd nodig heeft om een een item voor de Buffer te produceren. Oplossingen met timeouts kunnen dus per definitie niet.
De enige 'mooie' oplossing die ik nu kan bedenken is een notification object in de Buffer te stoppen. De consumer leest deze als zijnde het ' stop'-signal en breakt uit zijn loop.
Handmatig de semaphore (in mijn geval is het geen semaphore, maar een blocking queue, dus gaat het ook moeilijker dan in het voorbeeld) 'uppen' als ik wil stoppen, en daarna niets uit de buffer lezen klinkt mij ook nogal vies in de oren.
Misschien zie ik iets heel eenvoudigs over het hoofd, maar op dit moment kom ik er gewoon even niet op...
Suggesties?