Ik heb met behulp van CodeProject en pseudocode van Wikipedia een producer/consumer geimplementeerd.
Maar het wil maar niet doen wat ik wil, en ik word er na een dag helemaal gek van. Zie het foute gedeelte ook niet meer... Iemand ideeen?
Ik gebruik een circular buffer om in te lezen/schrijven en deze wordt dan gedeeld door beide threads. Deze zitten in een struct myType waarbij 'usage' gedeeld wordt tussen producer/consumer, bufsize het totale grootte van de buffer geeft en read/write de positie in de buffer.
Ik heb twee semaphores, full/empty en een event shutdown.
...
Zie code in http://gathering.tweakers.net/forum/quote_message/30387649/0 (vierde reply)
...
Ten eerste vind ik het erg vreemd dat nadat de consumer bij een empty buffer heeft gewacht en gesignaled wordt (dus usage is niet meer 0!!) het nog kennelijk mogelijk is dat usage 0 is; getuige een assert. Maar ook waarom de consumer meer inleest dat er geschreven is, is mij een raadsel. Als usage 0 is dan is het gewoon leeg, en dan wacht deze thread ook op een wakeup.
Ik heb ook sporadisch dat de ReleaseSemaphore functie een error teruggeeft over dat er teveel werd aangeroepen (max overschreden die nu op 1 staat).
Wat doe ik nou fout?
P.S. Ik heb bij mijn code de CriticalSection weggelaten omdat (volgens wikipedia) deze niet nodig zijn bij Monitors.
Maar het wil maar niet doen wat ik wil, en ik word er na een dag helemaal gek van. Zie het foute gedeelte ook niet meer... Iemand ideeen?
Ik gebruik een circular buffer om in te lezen/schrijven en deze wordt dan gedeeld door beide threads. Deze zitten in een struct myType waarbij 'usage' gedeeld wordt tussen producer/consumer, bufsize het totale grootte van de buffer geeft en read/write de positie in de buffer.
Ik heb twee semaphores, full/empty en een event shutdown.
...
Zie code in http://gathering.tweakers.net/forum/quote_message/30387649/0 (vierde reply)
...
Ten eerste vind ik het erg vreemd dat nadat de consumer bij een empty buffer heeft gewacht en gesignaled wordt (dus usage is niet meer 0!!) het nog kennelijk mogelijk is dat usage 0 is; getuige een assert. Maar ook waarom de consumer meer inleest dat er geschreven is, is mij een raadsel. Als usage 0 is dan is het gewoon leeg, en dan wacht deze thread ook op een wakeup.
Ik heb ook sporadisch dat de ReleaseSemaphore functie een error teruggeeft over dat er teveel werd aangeroepen (max overschreden die nu op 1 staat).
Wat doe ik nou fout?
P.S. Ik heb bij mijn code de CriticalSection weggelaten omdat (volgens wikipedia) deze niet nodig zijn bij Monitors.
[ Voor 42% gewijzigd door Darkvater op 09-07-2008 00:16 . Reden: nieuwe code ]
Windows Vista? *NEVER* Het waarom - Opera forever!!!
I've seen chickens that were more menacing. Chickens in a coma. On ice. In my fridge