Threadsichere Queue



  • Jochen Kalmbach schrieb:

    Der Code ist aber GPL! Es gilt *immer* die striktere Lizenz! Und da beide erwähnt werden (LGPL & GPL) ist es nun mal GPL...

    ach stimmt, du hast recht. naja, kommerzielle verwertung ist ja trotzdem erlaubt.
    🙂



  • Naja... aber nicht wirklich.... da Du ja dann selber den *gesamten Source unter GPL stellen musst... was sich eigentlich ausschliest... es sei Denn Du hast eine OpenSource-Firma...

    Aber mir ist das schon lange bewusst: OpenSource ist wunderbar, so lange man sich nicht um die Lizenzen schert...



  • abgesehen von den Lizenzen, das schaut doch aus wie ein Ringbuffer.

    /*
    * Porting note:
    * Reads and writes of a variable of this type in memory
    * must be *atomic*! 'int' is *not* atomic on all platforms.
    * A safe type should be used, and sfifo should limit the
    * maximum buffer size accordingly.
    */

    typedef int sfifo_atomic_t;

    typedef struct sfifo_t
    {
    char buffer;
    int size; /
    Number of bytes /
    sfifo_atomic_t readpos; /
    Read position /
    sfifo_atomic_t writepos; /
    Write position */
    } sfifo_t;

    das *atomic* bezieht sich jetzt nicht auf den Datenspeicher "buffer"
    sondern auf die Lese- und Schreibpositionen !? Oder versteh ich das falsch ?

    Von atomic Operationen hab ich ja ne Vorstellung, Operationen die ohne
    Unterbrechung ausgeführt werden, aber wie ist das in Zusammenhang mit
    *this type in memory* zu verstehen 😕

    #ifdef __TURBOC__
    # define SFIFO_MAX_BUFFER_SIZE 0x7fff
    #else /* Kludge: Assume 32 bit platform */
    # define SFIFO_MAX_BUFFER_SIZE 0x7fffffff
    #endif

    Ist damit gemeint, auf 16 bit Plattformen würden mögliche 32bit Werte in 2
    Registern gehalten, was dann nicht mehr atomic ist ... 😕

    Hab ich das richtig oder falsch aufgefasst ?


    Danke !


  • Mod

    @Michael S.:
    Ich verstehe nicht wie Dein beschriebenes Szenario zu einem Deadlock führen kann!



  • Hallo,
    Ich verstehe es auch nicht. Selbst wenn ein Thread mit höhrere Priorität wartet, beliben die anderen ja nicht stehen.

    Und bei CriticalSection geht der Thread doch eh in einen Idle-Mode zum warten oder nicht?

    Stefan



  • RED-BARON schrieb:

    Ist damit gemeint, auf 16 bit Plattformen würden mögliche 32bit Werte in 2
    Registern gehalten, was dann nicht mehr atomic ist ... 😕

    Hab ich das richtig oder falsch aufgefasst ?


    Hast du richtig verstanden, ist analog zu 32Bit Systemen und 64Bit Werten.



  • Martin Richter schrieb:

    @Michael S.:
    Ich verstehe nicht wie Dein beschriebenes Szenario zu einem Deadlock führen kann!

    Vielleicht meint er das: http://msdn.microsoft.com/en-us/library/aa450594.aspx


  • Mod

    TheTester schrieb:

    Martin Richter schrieb:

    @Michael S.:
    Ich verstehe nicht wie Dein beschriebenes Szenario zu einem Deadlock führen kann!

    Vielleicht meint er das: http://msdn.microsoft.com/en-us/library/aa450594.aspx

    Und hiew steht doch klar, dass dieses Problem durch den Priority Boost, bzw. Priority Inversion gelöst wird!
    Ich verstehe immer noch nicht wie hier ein Deadlock geschehen kann...



  • Erstmal danke für die Antworten:

    Ich glaube das soll das Problem sein dass WinCE (Ver.5.0) Priority Boost, bzw. Priority Inversion nicht ausführen wird.
    Denn nur dadurch kann der höherpriorisierter Thread wieder fortgesetzt werden.
    Zur Erinerung:
    Thread A => hochprior. thread
    Thread B => niedrigprior. thread

    Thread A:

    m_cs.Lock();
    RB.Einbau();
    m_cs.Unlock();

    Thread B:

    m_cs.Lock();
    RB.Ausbau();
    m_cs.Unlock();

    B wird unterbrochen von A in der CriticalSection Ausführung (RB.Ausbau() )
    => A wird warten (und das solange bis B wieder fortgesetzt wird wegen Lock von B). B kann aber nur fortgesetzt werden wenn die Prior. von B >= A wird, was OC machen müsste (Priority Boost). Fehlt der Priority Boost was angeblich unter WinCE nicht gibt wird A nie fortgestezt was zu DeadLock führt. (DeadLock = Thread wird nie fortgesetzt werden können)

    Das ist nach meinem verständis.

    Sehe ich da etwas falsch?



  • Ich glaube das ist die Antwort auf meine eigentliche Frage:

    http://msdn.microsoft.com/en-us/library/aa450594.aspx

    Danke.


Anmelden zum Antworten