2013-04-04 4 views
27

Ho un'applicazione C++ che consiste in C++ non gestito, C++ gestito e C#. Nella parte non gestita sto provando a creare una raccolta thread-safe usando std :: mutex.Quando si ottiene questo errore: <mutex> non è supportato durante la compilazione con/clr

Tuttavia quando uso il mutex ottengo il seguente errore;

error C1189: #error : <mutex> is not supported when compiling with /clr or /clr:pure.

Qualche idea del motivo per cui non posso utilizzare il mutex? Qualcuno può consigliarne una sostitutiva per poter creare una raccolta non gestita thread-safe?

+0

Perché non usi 'Monitor', che è praticamente l'equivalente gestito di' mutex'? – svick

+0

Ma posso usarlo all'interno del codice non gestito? –

+5

La tua migliore scommessa è probabilmente per [disattivare il supporto CLR] (http://stackoverflow.com/questions/808250/vc2008-how-to-turn-clr-flag-off-for-individual-files-in-c- cli-project) per una singola unità di compilazione (file cpp). –

risposta

15

Non è supportato perché l'implementazione std :: mutex utilizza GetCurrentThreadId(). Questa è una funzione winapi che non è supposta da utilizzare nel codice gestito poiché potrebbe essere in esecuzione su un host CLR personalizzato che non utilizza thread per implementare il threading.

Questo è il buon tipo di problema da avere, mostra che stai creando il tuo codice sbagliato. Il tuo C++ nativo viene compilato con/clr in effetto. Che funziona piuttosto bene, tutto il codice compatibile con C++ 03 può essere compilato su MSIL e ottenere una compilazione just-in-time in fase di runtime, proprio come il codice gestito. Non vuoi che ciò accada, il tuo codice C++ nativo dovrebbe essere compilato in codice macchina e ottenere l'amore dell'ottimizzatore del codice compilazione.

Disattivare l'opzione/clr per questo file di codice sorgente, e possibilmente altri, nel progetto. Fare clic con il tasto destro del mouse su + Proprietà, Generale. Se nel file .h viene visualizzato il numero mutex in un file sorgente C++/CLI, si ha un problema più grande, utilizzare un'interfaccia o un pimpl per nascondere i dettagli dell'implementazione.

+3

* "Disattiva l'opzione'/clr' per questo file di codice sorgente ... usa '#pragma managed' per passare avanti e indietro" * - Perdona la mia ignoranza ... Puoi fornire un rapido esempio di esso? – jww

+0

#pragma gestito (push, off) .. codice nativo .. #pragma gestito (pop) vedere https://msdn.microsoft.com/en-us/library/0adb9zxe.aspx – Petro

+0

L'opzione '/ clr' ha effetto codice nativo compilato in una libreria statica e infine collegato a una libreria gestita? In altre parole, ho compilato una libreria statica senza '/ clr'. Se compilo la libreria che collega quella libreria statica con '/ clr', influenzerà anche la libreria statica? –