如何制作托管(clr)多线程c ++ .dll?

时间:2014-11-25 22:05:54

标签: c++ multithreading dll clr managed

我正在尝试在c ++中创建一个需要支持多线程的托管.dll。我正在使用平台工具集版本v120在visual Studio 2013中进行开发。我需要将其作为托管程序集的原因是因为需要在LabView中集成程序集。

按照Creating and Using a Managed Assembly in VC++ 2010中的步骤提供了良好的结果。但是我显然需要实现更复杂的东西,当我包含线程并编写以下代码时:

#pragma once
#include <thread>

using namespace System;
using namespace std;


namespace MultiThread_module {

    public ref class multiThreadingTest
    {
    public:
        String^ GetVersion();
        int someNumber;

    private:

        thread testThread;
    };
}

我收到以下错误:

  

&#34;螺纹&#34;使用/ clr或/ clr:pure进行编译时不支持。

     

托管类的成员不能是非托管类类型

     

错误指令:错误:不支持并发运行时   编译/ clr。

     

错误指令:使用/ clr或编译时不支持   / CLR:纯

我的一位朋友说,如果不使用像boost这样的外部软件包,就不可能在Visual Studio中编写多线程代码。这似乎不太可能,因为多线程已经在C#和VB已经存在很长时间了!

所以,如果你能让我知道我做错了什么,我会很高兴如果用c ++开发的托管多线程.dll真的很难?

2 个答案:

答案 0 :(得分:1)

您可以使用托管线程库:System.Threading.Thread

#pragma once

using namespace System;
using namespace std;
using namespace System::Threading;


namespace MultiThread_module {

    public ref class multiThreadingTest
    {
    public:
        String^ GetVersion();
        int someNumber;

    private:

        Thread^ testThread;
    };
}

答案 1 :(得分:0)

如果它纯粹是CLR,那么我建议您使用之前提供的示例。如果你想让线程完全是原生的并且只是使用CLR来包装它,我想把你推荐给我:using clr and std::thread

  
    

可能是一个老问题,但我之前研究过同样的问题。由于CLR不允许您包含 std :: thead     编译时,您可以尝试仅在链接时使用它。一般     你可以解决这个问题,在你的标题中声明这个类     并将它们仅包含在您的cpp文件中。但是你可以转发     在头文件中声明自己的类,但不能     命名空间std中的类。根据C ++ 11标准,17.6.4.2.1:

         

如果添加声明或者C ++程序的行为是未定义的     命名空间std或命名空间std中的命名空间的定义     除非另有说明。

  
     

此问题的解决方法是创建一个线程类   继承自std :: thread你可以转发声明。标题   这个类的文件看起来像:

#pragma once
#include <thread>
#include <utility>
namespace Threading
{
  class Thread : std::thread
  {
  public:
      template<class _Fn, class... _Args> Thread(_Fn fn, _Args... args) : std::thread(fn, std::forward<_Args...>(args...))
      {

      }
  private:

  };
}
     

在您要使用线程的头文件中,您可以执行此操作   转发声明如下:

#pragma once

// Forward declare the thread class 
namespace Threading { class Thread; }
class ExampleClass
{
    public:
        ExampleClass();
        void ThreadMethod();
    private:
        Threading::Thread * _thread;
};
     

在源文件中,您可以使用theading类,如:

#include "ExampleClass.h"
#include "Thread.h"

ExampleClass::ExampleClass() :
{
    _thread = new Threading::Thread(&ExampleClass::ThreadMethod, this);
}

void ExampleClass::ThreadMethod()
{
}
     

希望它可以帮助任何人。