收到此错误时如何实现非托管线程安全集合: <mutex> 使用 /clr 编译时不支持

How to implement a unmanaged thread-safe collection when I get this error: <mutex> is not supported when compiling with /clr

本文关键字:集合 lt mutex 使用 编译 不支持 clr 安全 gt 何实现 错误      更新时间:2023-10-16

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

然而,当我使用互斥锁时,我得到以下错误;

error C1189: #error: 在使用/clr或/clr:pure编译时不支持。

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

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

这是一个很好的问题,它表明你的代码是错误的。本机c++正在使用/clr进行编译。它工作得非常好,所有兼容c++ 03的代码都可以编译成MSIL,并在运行时进行即时编译,就像托管代码一样。如果你不希望这种情况发生,你的本地c++代码应该被编译成机器码,并得到编译时代码优化器的支持。

关闭这个源代码文件的/clr选项,可能还有项目中的其他源代码文件。右键单击+属性,常规。如果mutex出现在你必须#包含在c++/CLI源文件中的.h文件中,那么你有一个更大的问题,使用接口或pimpl来隐藏实现细节。