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

Mir*_*cko 28 c++ multithreading mutex c++-cli thread-safety

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

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

错误C1189:使用/ clr或/ clr:pure进行编译时不支持#error:<mutex>.

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

Han*_*ant 16

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

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

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

  • *"关闭此源代码文件的`/ clr`选项...使用`#pragma managed`来回切换"* - 原谅我的无知......你能提供一个简单的例子吗? (4认同)
  • #pragma Managed(push, off) .. 本机代码 .. #pragma Managed(pop) 请参阅 https://msdn.microsoft.com/en-us/library/0adb9zxe.aspx (2认同)
  • pimpl解决方案安全吗?你不是在骗编译器吗?例如,C ++ / CLI代码包括一个包含pimpl的标头,而impl使用互斥锁,当C ++ / CLI代码调用一个依次锁定互斥锁的函数时,不是从托管代码中调用“ GetCurrentThreadId”不使用线程? (2认同)