Подтвердить что ты не робот

Как реализовать неуправляемую поточно-безопасную коллекцию при получении этой ошибки: <mutex> не поддерживается при компиляции с/clr

У меня есть приложение на С++, которое состоит из неуправляемого С++, управляемого С++ и С#. В неуправляемой части я пытаюсь создать потокобезопасную коллекцию, используя std:: mutex.

Однако, когда я использую мьютекс, я получаю следующую ошибку:

ошибка C1189: #error: <mutex> не поддерживается при компиляции с /clr или/clr: pure.

Любая идея, почему я не могу использовать мьютекс? Может ли кто-то рекомендовать замену для него, чтобы я мог создать потокобезопасную неуправляемую коллекцию?

4b9b3361

Ответ 1

Он не поддерживается, потому что реализация std:: mutex использует GetCurrentThreadId(). Это функция winapi, которая не должна использоваться в управляемом коде, поскольку она может работать на пользовательском хосте CLR, который не использует потоки для реализации потоковой передачи.

Это хорошая проблема, которая показывает, что вы неправильно строите свой код. Ваш собственный С++ скомпилирован с /clr. Что работает слишком хорошо, весь совместимый с С++ 03 код можно скомпилировать в MSIL и получить вовремя компиляцию во время выполнения, точно так же, как управляемый код. Вы не хотите, чтобы это произошло, ваш собственный код на С++ должен быть скомпилирован для машинного кода и получить оптимизацию оптимизатора кода компиляции.

Отключите параметр /clr для этого файла исходного кода и, возможно, других, в вашем проекте. Щелкните правой кнопкой мыши + Свойства, Общие. Если в файле .h будет отображаться символ mutex, который должен содержать #include в исходном файле С++/CLI, тогда у вас есть большая проблема, используйте интерфейс или pimpl, чтобы скрыть детали реализации.