2009-08-02 6 views
10

私はWin32上でPOSIXスタイルの条件変数を使用したいと考えています。私はXP上で実行する必要があるいくつかのコードがあるので、私はVista/Server 2008のCONDITION_VARIABLEを使用することはできません。XP用WinthreadsのCRITICAL_SECTIONsの条件変数の実装

現在、擬似条件変数クラスを使用しています。これは、クリティカルセクションを離れ、シグナリング/スリープ解除のための自動リセットイベントを通知することに基づいています。条件変数を待つために、イベントにクリティカルセクションWaitForSingleObjectを残して、クリティカルセクションに再び入ります。これは大部分は問題ありませんが、放送はサポートされていませんし、フェアネスに関して他の問題もあるかもしれませんが、私はあまり気にしません。

私はブーストを使用するので、条件変数をサポートするブーストスレッドまたはpthreads-win32を使用できることはわかっていますが、理想的には、インタフェースを私がMicrosoftの実装でドロップできるようにしたいと思っています。それを直接使用することが可能になります。私はStrategies for Implenting POSIX Condition Variables on Win32を見ましたが、 "ベスト"(最も正確な)ソリューションは、CRITICAL_SECTIONではなく、ミューテックスを使用しています。 second partCRITICAL_SECTIONという実装のスケッチがありますが、それは完全ではなく、CRITICAL_SECTIONのその他の解決策は記事に記載されている懸念から私に関心を寄せています。

要するに、Microsoftの実装が利用可能になったときに重要なセクションのwin32で条件変数を正しく(必ずしも良いとは限りませんが)実装することはできますか?

答えて

6

あなたが参照した論文は私の同僚によってACE C++フレームワークとそのOSラッパーファサードに関する私たちの研究の成果として書かれました。私のバイオで言及したように、「私はWindowsを使っていません」と言われていますが、ACEについては積極的に取り組んでいますが、ちょっと見てきましたが、Win32の条件変数の実装ではCRITICAL_SECTIONを使用していますミューテックスを使用していますが、深く掘り下げてみると、ミューテックスがWindowsプラットフォームではCRITICAL_SECTIONと定義されている下のレイヤーがあります。

FYIでは、新しいVista APIを使用するようにコードが変更されていないことを確認するため、実際にチェックしたコードベースは1.5行分の分岐です。

C++ラッパーではなく、条件変数のC APIが必要な場合は、このすべてを1組のファイルに含める必要があります。ace/OS_NS_Thread.{h,inl,cpp} ACEのライセンスはGPLではなく非常に寛大です「GPL汚染」を恐れることなく、そこから独自のコードベースにコードをリフトします。

ACEのリリースはhttp://download.dre.vanderbilt.edu/になります。私が調べたバージョンは、OCIによって維持され、http://www.theaceorb.com/downloads/1.5a/index.htmlでダウンロード可能なACE 5.5.2から派生した商業的にサポートされたリリースです。

私はACEの長年のユーザー/コントリビュータ/保守者であり、その研究スタッフをしばらくは働いており、現在はOCIの従業員です。私はそれがあなたのためにこのコードの実用性/適用可能性を変えるとは思っていませんし、上記の実体のどれもがあなたからソースからコードを持ち上げて収入を得ることはありません。

+0

いいね!どうもありがとう。 –