30

我有一个 C++ 应用程序,它由非托管 C++、托管 C++ 和 c# 组成。在非托管部分,我尝试使用 std::mutex 创建线程安全集合。

但是,当我使用互斥锁时,出现以下错误;

错误 C1189:#error : <mutex> 在使用 /clr 或 /clr:pure 编译时不受支持。

知道为什么我不能使用互斥锁吗?有人可以推荐一个替代品,以便我可以创建一个线程安全的非托管集合吗?

4

1 回答 1

20

不支持它,因为 std::mutex 实现使用 GetCurrentThreadId()。这是一个不应在托管代码中使用的 winapi 函数,因为它可能在不使用线程来实现线程的自定义 CLR 主机上运行。

这是一个很好的问题,它表明您正在构建错误的代码。您的本机 C++ 正在使用 /clr 进行编译。效果太好了,所有符合 C++03 的代码都可以编译为 MSIL 并在运行时即时编译,就像托管代码一样。您不希望这种情况发生,您的本机 C++ 代码应该编译为机器代码并获得编译时代码优化器的喜爱。

在您的项目中关闭此源代码文件以及可能的其他文件的 /clr 选项。右键单击 + 属性,常规。如果mutex.h 文件中出现您必须 #include 在 C++/CLI 源文件中,那么您遇到了更大的问题,请使用接口或 pimpl 隐藏实现细节。

于 2013-04-04T22:12:40.427 回答