2009-08-02 43 views
10

Ich habe einen Wunsch nach POSIX-Stil-Zustandsvariablen auf Win32. Ich habe etwas Code, der auf XP laufen muss, also kann ich Vista/Server 2008 CONDITION_VARIABLE nicht verwenden.Implementieren von Bedingungsvariablen für CRITICAL_SECTIONs für WinThreads für XP

Es verwendet derzeit eine Pseudo-Zustandsvariablen-Klasse, die darauf basiert, den kritischen Abschnitt zu verlassen und ein Auto-Reset-Ereignis für Signalisierung/Aufwachen zu signalisieren. Wenn Sie auf die Bedingungsvariable warten, wird der kritische Abschnitt WaitForSingleObject s des Ereignisses verlassen und der kritische Abschnitt erneut aufgerufen. Das ist meistens in Ordnung, aber es unterstützt keine Übertragung und hat vielleicht andere Probleme in Bezug auf Fairness, die mir nicht so wichtig sind.

Wir verwenden Boost, also weiß ich, dass ich Boost-Threads oder pthreads-win32 verwenden könnte, die Bedingungsvariablen unterstützen, aber idealerweise möchte ich, dass die Schnittstelle so ist, dass ich die Microsoft-Implementierung einfügen kann wird es möglich, es direkt zu verwenden. Ich habe Strategies for Implenting POSIX Condition Variables on Win32 gesehen, aber die "beste" (korrekteste) Lösung verwendet einen Mutex und nicht einen CRITICAL_SECTION. Es gibt eine Skizze einer Implementierung mit einer CRITICAL_SECTION in der second part, aber es ist nicht vollständig, und die anderen Lösungen mit CRITICAL_SECTION s betreffen mich aufgrund der Bedenken, die für sie in dem Artikel beschrieben werden.

Kurz gesagt, wie implementiere ich eine korrekte, nicht unbedingt fair (aber das wäre nett), Bedingung Variable auf Win32 für kritische Abschnitte, so dass ich in Microsofts Implementierung fallen lassen kann, wenn es mir zur Verfügung steht?

Antwort

6

Die Papiere, auf die Sie sich beziehen, wurden von Kollegen von mir als Folge unserer Arbeit am ACE C++ Framework und seinen OS Wrapper-Fassaden geschrieben. Wie ich in meiner Biographie "Ich mache kein Windows" erwähnt habe, arbeite ich immer noch aktiv an ACE, und ich habe mir das mal angesehen und es scheint, dass die Implementierung der Bedingungsvariablen für Win32 CRITICAL_SECTION verwendet (bei der ersten Inspektion sieht es so aus Verwenden Sie einfach einen Mutex, aber wenn Sie tiefer graben, werden Sie feststellen, dass es unten eine Ebene gibt, in der ein Mutex als CRITICAL_SECTION auf Windows-Plattformen definiert ist.

FYI, um sicherzustellen, dass der Code nicht geändert wurde, um die neuen Vista-APIs zu verwenden, ist die Codebasis, die ich überprüft habe, tatsächlich eine Abzweigung von der Linie 1.5.

Angenommen, Sie möchten nur eine C-API für Bedingungsvariablen und keine C++ - Wrapper darum herum, all dies sollte in einem Satz von Dateien enthalten sein: ace/OS_NS_Thread.{h,inl,cpp} Die Lizenz auf ACE ist sehr großzügig, und nicht GPL, so können Sie Heben Sie den Code von dort in die proprietäre Codebasis auf, ohne "GPL-Kontamination" befürchten zu müssen.

Sie können Freigaben von ACE bei http://download.dre.vanderbilt.edu/ erhalten; Bei der von mir inspizierten Version handelt es sich um eine kommerziell unterstützte Version, die von ACE 5.5.2 abgeleitet ist und von OCI verwaltet wird und unter der Nummer http://www.theaceorb.com/downloads/1.5a/index.html zum Herunterladen zur Verfügung steht.

Im Interesse der vollständigen Offenlegung, war ich ein langjähriger Benutzer/Mitarbeiter/Betreuer für ACE, arbeitete für eine Weile an diesem Forschungsteam und bin jetzt ein Angestellter von OCI. Ich denke nicht, dass sich dadurch die Nützlichkeit/Anwendbarkeit dieses Codes für Sie ändert, und auch keiner der oben genannten Entitäten erzielt Einnahmen, wenn Sie Code von der Quelle abrufen.

+0

Sieht gut aus! Vielen Dank. –

Verwandte Themen