30

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

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

エラー C1189: #error : /clr または /clr:pure でコンパイルする場合、<mutex> はサポートされていません。

ミューテックスを使用できない理由は何ですか? スレッドセーフな管理されていないコレクションを作成できるように、誰かがそれに代わるものを推奨できますか?

4

1 に答える 1

20

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

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

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

于 2013-04-04T22:12:40.427 に答える