我有一个C ++应用程序,它由非托管C ++,托管C ++和c#组成。在非托管部分,我正在尝试使用std :: mutex创建一个线程安全集合。
但是当我使用互斥锁时,我收到以下错误;
错误C1189:#error:< mutex>使用/ clr或/ clr:pure进行编译时不支持。
知道为什么我不能使用互斥锁吗? 有人可以推荐替换它,以便我可以创建一个线程安全的非托管集合吗?
答案 0 :(得分:16)
不支持它,因为std :: mutex实现使用GetCurrentThreadId()。这是一个winapi函数,它不能在托管代码中使用,因为它可能在不使用线程实现线程的自定义CLR主机上运行。
这是一个很好的问题,它表明你正在构建错误的代码。您的本机C ++正在使用/ clr进行编译。哪个工作得相当好,所有符合C ++ 03标准的代码都可以编译为MSIL并在运行时进行即时编译,就像托管代码一样。您不希望发生这种情况,您的本机C ++代码应编译为机器代码并获得编译时代码优化器的喜爱。
在项目中关闭此源代码文件的/ clr选项,可能还有其他选项。右键单击+属性,常规。如果.h文件中出现mutex
,你必须在C ++ / CLI源文件中#include,那么你就会遇到更大的问题,使用接口或pimpl来隐藏实现细节。