Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

the[V]oid

Alter Hase

  • »the[V]oid« ist der Autor dieses Themas

Beiträge: 775

Wohnort: Aachen

  • Private Nachricht senden

1

19.02.2009, 03:56

Merkwürdiges Problem

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.
<< an dieser Stelle ist eine Signatur verstorben >>

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

19.02.2009, 08:22

Debuggst du viellicht den Release build?

Könnte es sein dass du ein Starvation Problem hast, kommt der andre Thread überhaupt in die Critical Section rein?
Es wäre vielleicht sinnvoll z.B. die Größe der Queue zu limitieren um ein Starvation Problem auf jeden Fall zu umgehen:

C-/C++-Quelltext

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
void /*[...]*/::read (/*[...]*/) 
{ 
    ReaderOrder* pOrder = new ReaderOrder (); 
    /*[...]*/ 
    m_csReaderOrders.enter (); 
    if (m_qReaderOrders.size() < 100)
      m_qReaderOrders.push (pOrder); 
    else
      Sleep(0);
    m_csReaderOrders.leave (); 
}


    ReaderOrder* popReaderOrder () 
    { 
        m_csReaderOrders.enter (); 
        ReaderOrder* pOrder = NULL; 
        if (m_qReaderOrders.size () > 0) 
        { 
            pOrder = m_qReaderOrders.front (); 
            m_qReaderOrders.pop (); 
        }
        else
           Sleep(0);
        m_csReaderOrders.leave (); 
        return pOrder; 
    }

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

3

19.02.2009, 10:38

Was für eine Kontainerklasse nutzt du eigentlich? Und kannst du vielleicht ein Minimalbeispiel erstellen? An Stravation glaube ich nicht. Vielleicht eher so ein kleiner Fehler, wie falsche Instanz erwischt o.ä.
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

the[V]oid

Alter Hase

  • »the[V]oid« ist der Autor dieses Themas

Beiträge: 775

Wohnort: Aachen

  • Private Nachricht senden

4

19.02.2009, 13:30

Die Critical-Sections machen keine Probleme, hab ich schon überprüft. Die Containerklasse ist std::queue. Ich werd naher nochmal prüfen, ob es auch die gleichen Instanzen sind.
<< an dieser Stelle ist eine Signatur verstorben >>

the[V]oid

Alter Hase

  • »the[V]oid« ist der Autor dieses Themas

Beiträge: 775

Wohnort: Aachen

  • Private Nachricht senden

5

19.02.2009, 16:49

Jop, die Instanzen waren nicht korrekt, eigentlich hatte ich es gestern Abend (Nacht? O_o) vor'm Posten noch überprüft, aber anscheinend war's einfach zu spät :D
<< an dieser Stelle ist eine Signatur verstorben >>

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

6

19.02.2009, 17:14

Es sind immer die gleichen kleinen Fehler, über die man irgendwann stolpert ;)
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

Werbeanzeige