Hm bin grad total ratlos....
PS. Ich glaube die CPP-Tags haben hier im Forum nen kleinen Fehler
Ich habe zwei Threads laufen. Zuerst wird in Thread 1 dieser Code ausgeführt:
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
|
void /*[...]*/::read (/*[...]*/)
{
ReaderOrder* pOrder = new ReaderOrder ();
/*[...]*/
m_csReaderOrders.enter ();
m_qReaderOrders.push (pOrder);
m_csReaderOrders.leave ();
}
|
Nach der Ausführung ist in der Queue m_qReaderOrders definitiv ein Element enthalten (per Debugger geprüft). Durch m_csReaderOrders wird eine Critical Section zur Synchronisation repräsentiert.
Thread 2 führt eine Dauerschleife aus und dührt folgenden Code aus. Hier einer der nächsten Aufrufe, nachdem der Code aus Listing 1 ausgeführt worden ist:
|
C-/C++-Quelltext
|
1
|
/*[...]*/ -> popReaderOrder ();
|
Und die ausgeführte popReaderOrder Funktion sieht so aus:
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
|
ReaderOrder* popReaderOrder ()
{
m_csReaderOrders.enter ();
ReaderOrder* pOrder = NULL;
if (m_qReaderOrders.size () > 0)
{
pOrder = m_qReaderOrders.front ();
m_qReaderOrders.pop ();
}
m_csReaderOrders.leave ();
return pOrder;
}
|
Bereits vor der Ausführung des IF-Blocks ist die Queue m_qReaderOrders laut Debugger lehr. Wie lässt sich das erklären?
Die in Listing 1 gezeigte Funktion (read) ist Member derselben Klasse wie popReaderOrder und beide werden auf denselben Objekten ausgeführt. Dennoch ist die Queue eigenartigerweise in Listing 3 leer, obwohl in Listing 1 etwas eingefügt wurde. Die Reihenfolge der Ausführung des Codes ist nicht zufällig und ich hab sie mittels Debugger überprüft. Auch wird auf die Queue sonst nirgends zugegriffen.
Danke im Voraus.