WaitForSingleObject



  • Hallo,

    ich habe eine Frage zur Prozess/Threadsynchronisation unter Windows. Ich möchte einen critischen Bereich vor gleichzeitigem Zugriff mehrerer Threads/Prozesse schützten. Ich habe dies mittels Mutex und der Funktion WaitForSingleObject() gemacht.

    MutexReturn = WaitForSingleObject(g_MutexHandle, CMD_TIMEOUT);
    
    if(MutexReturn != WAIT_OBJECT_0)
    {
        return -1; 
    }
    
    // critical section ....
    
    ReleaseMutex(g_MutexHandle);
    

    Auf Unixsystemen werden mehrere Prosesse/Threads, die auf einen Mutex warten ge-queued. Es wird demnach die ursprüngliche Aufrufreihenfolge der Prozesse die auf den Bereich zugreifen wollen, der durch den Mutex geschützt wird, eingehalten. Wie ist das unter Windows wenn man es so macht wie das Codebeispiel es zeigt? Oder gibt es andere Mechanismen die ein queueing von Prozessen unterstützen?

    Gruß
    Stefan



  • ich weis nur das man mit EnterCriticalSection() und dem Leave dazu in teufels küche kommt, weil genau an dieser stelle Windows seit Windows Server 2003 die reihenfolge der threads völlig ignoriert (unter XP scheint es noch eine art first come first server zu geben aber bestätigt wird das nicht, unter vista kommt meist 90% der fälle der thread gleich wieder dran der das leave zuvor aufgerufen hat)

    ich habe mal gelesen das meist der thread mit der "optimalsten" zugriffschance den "zuschlag" erhält und weiterarbeiten darf. aber laut mdsn sollte man die threads über waitforsingle / waitformulti synchronisieren aber das wie haben sie leider offen gelassen



  • Danke für die Antwort, das sieht Windows irgendwie ähnlich hmm... Naja muss ich mir was eigenes bauen



  • eventuell ne eigene prioritätsverwaltung, fraglich ist nur ob das sinn macht oder doch schon dafür irgendwas sinnvolles in der winapi vorhanden ist, aber das überlass ich lieber den echten spezialisten :p



  • Wenn es nur "schön" wäre wenn die Reihenfolge FIFO ist würde ich einfach WaitForSingleObject mit einer Mutex verwenden, da Windows AFAIK genau das macht (FIFO).

    Wenn es wichtig ist strick dir was eigenes, oder frag bei MS an wie das im Moment mit Mutexen ist und ob es so bleiben wird.



  • wie gesagt, mutex weis ichn nicht, aber critical sections funktionieren überhaupt nicht mehr nach FIFO prinzip



  • Ceos schrieb:

    wie gesagt, mutex weis ichn nicht, aber critical sections funktionieren überhaupt nicht mehr nach FIFO prinzip

    Eine Critical Section ist auch kein Kernelmode Objekt, daher kann man auch nicht mit WaitForSingleObject drauf warten.
    Events und Mutexen sind dagegen beides Kernelmode Objekte. Wichtiger und grundlegender Unterschied.



  • gut zu wissen _



  • Mutex? Critical Section? Semaphore?
    Kernel-Objects? User-Mode?

    Guckst Du: http://www.c-plusplus.net/forum/viewtopic-var-t-is-186523-and-highlight-is-.html
    Martin


Anmelden zum Antworten