如何使托管 (clr) 多线程 C++ .dll
How to make a managed (clr) multithreaded c++ .dll?
我正在尝试用 c++ 制作一个需要支持多线程的托管.dll。我正在使用平台工具集版本 v120 在 Visual Studio 2013 中进行开发。我需要它作为托管程序集的原因是因为它需要在LabView中集成该程序集。
按照在 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;
};
}
我收到以下错误:
使用/clr或/clr:pure 编译时不支持"thread"。
托管类的成员不能是非托管类类型
错误指令:错误:在以下情况下不支持并发运行时 编译/clr。
错误指令:使用/clr 或 /clr:纯。
我的一个朋友说,如果不使用像boost这样的外部包,就不可能在Visual Studio中编写多线程代码。这似乎不太可能,因为多线程已经在 C# 和 VB 中存在了很长时间!
所以,如果你能让我知道我做错了什么,或者如果真的很难用 c++ 开发一个托管的多线程.dll,我会很高兴?
您可以使用托管线程库: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;
};
}
如果它纯粹是CLR,那么我建议您使用之前提供的示例。如果你想让线程完全原生,只使用 CLR 来包装它,我想参考我的答案:使用 clr 和 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; };
在源文件中,您可以使用标题类,如下所示:
#include "ExampleClass.h" #include "Thread.h" ExampleClass::ExampleClass() : { _thread = new Threading::Thread(&ExampleClass::ThreadMethod, this); } void ExampleClass::ThreadMethod() { }
希望它可以帮助任何人。
- 在C++中使用cURL和多线程
- 多线程双缓冲区
- 为什么我的多线程作业队列崩溃
- 在main()之外初始化std::vector会导致性能下降(多线程)
- 试图创建一个多线程程序来查找0-100000000之间的总素数
- 为什么一个向量上的多线程操作很慢
- 学习多线程C++:添加线程不会使执行速度更快,即使它看起来应该
- 全局变量 多读取器 一个写入器多线程安全?
- boost::文件系统::recursive_directory_iterator多线程安全
- 如何阻止TensorFlow的多线程
- 如何在多线程中正确使用unique_ptr进行多态性?
- 并发/多线程:是否可以以这种方式生成相同的输出?
- sigwait() 在多线程程序中不起作用
- 多线程程序中出现意外的内存泄漏
- 静态 constexpr 类成员变量对多线程读取是否安全?
- 多线程比没有线程C++慢
- 具有 C++11 多线程的特征库
- 通过安装信号处理程序关闭多线程应用程序
- 成员变量在多线程 C++ 时自行更改
- 尝试从头开始实现Leetcode的FizzBuzz多线程问题。收到"libc++abi.dylib: terminating"错误