2013-04-04 7 views
27

Mam aplikację C++, która składa się z niezarządzanego C++, zarządzanego C++ i C#. W części niezarządzanej próbuję utworzyć bezpieczną kolekcję wątków przy użyciu std :: mutex.Jak zaimplementować niezarządzaną kolekcję bezpieczną dla wątków, gdy pojawia się ten błąd: <mutex> nie jest obsługiwany podczas kompilacji z/clr

Jednak gdy używam muteksa, otrzymuję następujący błąd;

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

Jakiś pomysł, dlaczego nie mogę użyć muteksu? Czy ktoś może zarekomendować zamiennik, aby móc utworzyć bezpieczną dla wątków kolekcję niezarządzaną?

+0

Dlaczego nie używasz 'Monitor', który jest właściwie zarządzanym odpowiednikiem' mutex'? – svick

+0

Ale czy mogę go używać w niezarządzanym kodzie? –

+5

Twoim najlepszym rozwiązaniem jest prawdopodobnie wyłączenie obsługi CLR (http://stackoverflow.com/questions/808250/vc2008-how-to-turn-clr-flag-off-for-individual-files-in-c- cli-project) dla pojedynczej jednostki kompilacji (plik cpp). –

Odpowiedz

15

Nie jest obsługiwany, ponieważ implementacja std :: mutex używa funkcji GetCurrentThreadId(). Jest to funkcja winapi, która nie jest używana w zarządzanym kodzie, ponieważ może być uruchomiona na niestandardowym hoście CLR, który nie używa wątków do implementowania wątków.

To jest dobry problem, który pokazuje, że źle budujesz swój kod. Twoje natywne C++ jest kompilowane z użyciem/clr. Który działa raczej zbyt dobrze, cały kod zgodny z C++ 03 może być skompilowany do MSIL i uzyskać kompilację w czasie rzeczywistym, podobnie jak kod zarządzany. Nie chcesz, aby tak się stało, twój natywny kod C++ powinien być skompilowany do kodu maszynowego i uzyskać miłość optymalizatora kodu kompilacji.

Wyłącz opcję/clr dla tego kodu źródłowego i ewentualnie innych w swoim projekcie. Kliknij prawym przyciskiem myszy + Właściwości, Ogólne. Jeśli plik mutex pojawia się w pliku .h, który musisz # zawierać w pliku źródłowym C++/CLI, to masz większy problem, użyj interfejsu lub pimpl, aby ukryć szczegóły implementacji.

+3

* "Wyłącz opcję'/clr' dla tego pliku kodu źródłowego ... użyj '#pragma managed', aby przełączać się w przód iw tył" * - Wybacz mojej niewiedzy ... Czy możesz podać szybki przykład tego? – jww

+0

#pragma managed (push, off) .. kod macierzysty .. #pragma managed (pop) zobacz https://msdn.microsoft.com/en-us/library/0adb9zxe.aspx – Petro

+0

Czy opcja '/ clr' wpływa natywny kod skompilowany do biblioteki statycznej i ostatecznie połączony z biblioteką zarządzaną? Innymi słowy, skompilowałem bibliotekę statyczną bez '/ clr'. Jeśli skompiluję bibliotekę, która łączy bibliotekę statyczną z '/ clr', czy będzie to miało wpływ również na bibliotekę statyczną? –

Powiązane problemy