web-dev-qa-db-ja.com

このエラーが発生したときにアンマネージスレッドセーフコレクションを実装する方法:/ clrでコンパイルすると、<mutex>はサポートされません

アンマネージC++、マネージC++、およびc#で構成されるC++アプリケーションがあります。アンマネージ部分では、std :: mutexを使用してスレッドセーフなコレクションを作成しようとしています。

しかし、ミューテックスを使用すると、次のエラーが発生します。

エラーC1189:#error:<ミューテックス>は、/ clrまたは/ clr:pureを指定してコンパイルする場合はサポートされません。

なぜミューテックスを使用できないのですか?スレッドセーフなアンマネージコレクションを作成できるように、誰かがそれの代わりを推奨することはできますか?

28
Miro Bucko

Std :: mutex実装はGetCurrentThreadId()を使用するため、サポートされていません。これは、スレッドを実装しないスレッドを使用しないカスタムCLRホストで実行されている可能性があるため、マネージコードで使用する想定ではないwinapi関数です。

これは良い種類の問題であり、コードを間違ってビルドしていることを示しています。ネイティブC++が/ clrを有効にしてコンパイルされています。これはあまりにもうまく機能します。すべてのC++ 03準拠コードをMSILにコンパイルして、マネージコードと同様に、実行時にジャストインタイムでコンパイルできます。これを望まない場合は、ネイティブC++コードをマシンコードにコンパイルして、コンパイル時のコードオプティマイザの愛を得る必要があります。

プロジェクトのこのソースコードファイル、および場合によっては他のファイルの/ clrオプションをオフにします。 [+プロパティ]、[全般]を右クリックします。 C++/CLIソースファイルに#includeする必要がある.hファイルにmutexが表示される場合は、さらに大きな問題が発生しているので、インターフェイスまたはpimplを使用して実装の詳細を非表示にします。

16
Hans Passant