【问题标题】:boost mutex C++/CLI problems提升互斥锁 C++/CLI 问题
【发布时间】:2011-08-05 22:17:53
【问题描述】:

我正在为 64 位开发 Visual Studio 2008 C#,我想使用一个使用 boost 的库。所以我用 C++/CLI 写了一个包装器。我设法解决了我遇到的错误

#include <boost/thread/mutex.hpp>.

如果我在我的 C++/CLI 包装器中包含任何本身包含 &lt;boost/thread/mutex.hpp&gt; 的文件,或者如果我将它直接包含在包装器中,我会收到“System.AccessViolationException”“试图读取或写入受保护的内存。这通常是表明其他内存已损坏。”

我在为 64 位构建所有东西时非常小心,所以我怀疑问题是否存在。当我在“普通”C++ 中使用 64 位相同的库时,一切正常。我遇到了一些帖子,人们似乎对 boost 线程有类似的问题,但我发现的解决方案都没有奏效。有人有想法吗?

【问题讨论】:

  • 你的意思是boost::asio 是一个使用boost::thread 的库吗?无论如何,一旦我确实想使用boost::asio 并最终在我的一个本地小库中使用winsock 以由C++/Cli 包装。很抱歉,boost 不是直接接触 C++/Cli 的正确库。尽量避免。

标签: multithreading boost 64-bit c++-cli mutex


【解决方案1】:

问题是 boost.thread 使用了一些 #pragma section 指令,这些指令在没有 /clr 的情况下构建时不兼容,然后静态链接到使用 /clr 的代码。

我听说使用 /clr 重建 boost.thread(即,在调用 bjam 时传递 cxxflags="/clr")可以解决问题,但我没有亲自尝试过。

我认为动态链接到 boost.thread(而不是静态链接,这是 VC++ 的默认设置;#define BOOST_THREAD_DYN_LINK 在包含任何 boost 标头之前)也应该可以工作,但是我还没有尝试过。

如果这不起作用,请尝试使用谷歌搜索 boost thread clr tls 的组合;你应该在 boost 邮件列表上找到很多关于它的帖子,因为这是一个问题。


编辑:正如 Raman Sharma(Microsoft 的高级 PM)所评论的 here,即使是 std::mutex 也不支持 /clr,因此 boost.thread 的互斥体也就不足为奇了实现也不是。

【讨论】:

    【解决方案2】:

    正如另一个答案所说,tss_pe.cpp 中的 boost 编译指示与 CLR 不兼容。对该文件的简单修改虽然可以解决该问题,但将允许静态链接。我对 Boost 1.44 的修改版本是 here(不同之处与 this 所做的更改)。

    【讨论】:

      【解决方案3】:

      某些 Boost 库不得与 C++ CLI 代码静态链接,否则编译器可能会为某些 Windows 版本生成不兼容的映像。 就我而言,在 Windows 10 下使用 VC++ 2017 静态构建 Boost 1.64 x86 线程库时,我很难弄清楚这个问题。 该二进制文件在 Windows 10 下运行良好,但在 Windows 7 下引发了 System.BadImageFormatException。 问题出在我最初静态链接到我的 C++ CLI 程序集的 Boost 线程库中。

      这是一个很容易重现问题的简短代码:

      testcli.h - C++ CLI 汇编失败代码

      #pragma comment(lib, "libboost_thread-vc141-mt-1_64.lib") // static link makes the program crash under W7
      
      namespace testcli
      {
          public ref class TestClass { public: static void Test(){} };
      }
      

      Program.cs - C# 客户端代码加载“testcli”

      using testcli;
      
      namespace Cli
      {
          class Program { static void Main(string[] args) { new TestClass(); } } // instanciate C++ CLI Boost class 
      }
      

      上面的代码通过引发System.BadImageFormatException(可以在应用程序事件查看器中找到异常)返回。

      如果更改了 testcli 以便现在动态链接 Boost 线程库:

      testcli.h - C++ CLI 程序集成功代码

      #pragma comment(lib, "boost_thread-vc141-mt-1_64.lib") // dynamic link works fine under any Windows
      
      namespace testcli
      {
          public ref class TestClass { public: static void Test(){} };
      }
      

      代码现在成功返回。

      请注意,您可以定义 BOOST_THREAD_DYN_LINK 而不是 BOOST_ALL_DYN_LINK,如下所述:http://www.boost.org/doc/libs/1_64_0/doc/html/thread/build.html

      这样做,您不必将所有 Boost 动态库与您的应用程序打包在一起。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-07-09
        • 1970-01-01
        • 1970-01-01
        • 2013-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-09
        相关资源
        最近更新 更多