Ik heb 2 classes: CReferenceBuffer en CSyncFIFO.
CReferenceBuffer is een buffer class die bedoeld is om vanuit meerdere threads gebruikt te worden. Hiermee kan ik (net zoals in COM) mbv AddRef en Release de refcount verhogen en verlagen. Als de RefCount 0 is wordt hij vrijgegeven.
Deze class gebruik ik in de class CSyncFIFO. Dit is een implementatie van een synchronized FIFO. Deze class wordt ook vanuit meerdere threads gebruikt (1 thread om buffers toe te voegen en 1 om ze weer uit de FIFO te halen).
Voor CSyncFIFO heb ik ook nog een typedef:
Dit is de class-declaratie van CSyncFIFO:
Vanuit de ene thread (producer) wordt dus een CReferenceBuffer instance gemaakt, deze wordt mbv Push in de FIFO gezet. De andere thread (consumer) haalt mbv Pop weer de eerste buffer in de FIFO op.
In deze Pop functie zit het probleem. Ik zal eerst even de code van Pop posten om het wat duidelijker te maken:
_BLOCK_TYPE_IS_VALID(pHead->nBlockUse) in DBGHEAP.C regel 1050.
Teruggaand op de callstack kom ik bij regel 12 in de voorgaande code uit.
De code in regel 11 gaat gewoon goed.
Iemand een idee?
CReferenceBuffer is een buffer class die bedoeld is om vanuit meerdere threads gebruikt te worden. Hiermee kan ik (net zoals in COM) mbv AddRef en Release de refcount verhogen en verlagen. Als de RefCount 0 is wordt hij vrijgegeven.
Deze class gebruik ik in de class CSyncFIFO. Dit is een implementatie van een synchronized FIFO. Deze class wordt ook vanuit meerdere threads gebruikt (1 thread om buffers toe te voegen en 1 om ze weer uit de FIFO te halen).
Voor CSyncFIFO heb ik ook nog een typedef:
C++:
1
| typedef std::list<CReferenceBuffer*> TBufferList; |
Dit is de class-declaratie van CSyncFIFO:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
| class CSyncFIFO { protected: HANDLE hListMutex; TBufferList blFifo; public: CSyncFIFO(); virtual ~CSyncFIFO(); CReferenceBuffer* Pop(void); bool Push(CReferenceBuffer* prbBuffer); }; |
Vanuit de ene thread (producer) wordt dus een CReferenceBuffer instance gemaakt, deze wordt mbv Push in de FIFO gezet. De andere thread (consumer) haalt mbv Pop weer de eerste buffer in de FIFO op.
In deze Pop functie zit het probleem. Ik zal eerst even de code van Pop posten om het wat duidelijker te maken:
C++:
Het probleem dat ik heb zit hem bij blFifo.erase(iBuffers). Af en toe krijg ik hier de volgende assert melding:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| CReferenceBuffer* CSyncFIFO::Pop() { TBufferList::iterator iBuffers; CReferenceBuffer* prbResult = NULL; WaitForSingleObject(hListMutex, INFINITE); iBuffers = blFifo.begin(); if (iBuffers != blFifo.end()) { prbResult = *iBuffers; blFifo.erase(iBuffers); } ReleaseMutex(hListMutex); return prbResult; } |
_BLOCK_TYPE_IS_VALID(pHead->nBlockUse) in DBGHEAP.C regel 1050.
Teruggaand op de callstack kom ik bij regel 12 in de voorgaande code uit.
De code in regel 11 gaat gewoon goed.
Iemand een idee?