c+中调用函数的效果+;来自多个线程的dll 我有一个C++协议栈DLL(用于串行通信),它将一个类暴露给一个前端应用程序。暴露类如下图所示: class ProtocolStack { public : void OpenRequest(Params); void SendData(Params); void CloseRequest(Params); };

c+中调用函数的效果+;来自多个线程的dll 我有一个C++协议栈DLL(用于串行通信),它将一个类暴露给一个前端应用程序。暴露类如下图所示: class ProtocolStack { public : void OpenRequest(Params); void SendData(Params); void CloseRequest(Params); };,c++,multithreading,dll,C++,Multithreading,Dll,ProtocolStack类创建不同的层,如PhysicalLayer,如下所示 class PhysicalLayer { private: int Baud_rate; string PortName; public: void Send(string); void Receive(); }; 我想使用相同的协议栈从不同的系统并行读取数据。 如果我创建一个协议栈对象进行并行读取(从不同的端口),当从不同的线程同时调用相同的函数时,为每个函数调用分配的数据段

ProtocolStack类创建不同的层,如PhysicalLayer,如下所示

class PhysicalLayer
{
private:
    int Baud_rate;
    string PortName;
public:
    void Send(string);
    void Receive();
 };
我想使用相同的协议栈从不同的系统并行读取数据。 如果我创建一个协议栈对象进行并行读取(从不同的端口),当从不同的线程同时调用相同的函数时,为每个函数调用分配的数据段是否会不同

它会破坏物理层的私有变量。对吧?

我是否需要维护每层中每个通道(并行连接)的所有数据


我想并行处理数据。除了创建另一个堆栈对象或维护每个层中与连接相关的所有数据之外,还有其他方法吗?

代码位于DLL中这一事实与此无关。代码就是代码。关于数据共享,只有在代码选择这样做的情况下,才会在线程之间共享数据。如果代码使用基于堆栈的内存或分配自己的基于堆的内存,则数据不会共享。如果代码将其数据存储在全局范围内,那么数据将在线程之间共享。如果代码是由您编写的,或者托管在DLL中的第三方库中,则情况也是如此

问题归结为代码的线程规则。代码可能根本不支持线程化使用。只要遵循某些规则,代码可能支持线程化使用。他们唯一确定的方法是查阅代码的文档,当然希望其他人实际记录他们的线程模型


在对问题的评论中,您说:

我的问题是,当同时调用dll中的函数时,是否会为同一对象存储单独的数据属性


不,他们不会。如果有两个线程引用同一对象,那么一个线程对该对象数据的修改将被另一个线程看到。

代码位于DLL中的事实与此无关。代码就是代码。关于数据共享,只有在代码选择这样做的情况下,才会在线程之间共享数据。如果代码使用基于堆栈的内存或分配自己的基于堆的内存,则数据不会共享。如果代码将其数据存储在全局范围内,那么数据将在线程之间共享。如果代码是由您编写的,或者托管在DLL中的第三方库中,则情况也是如此

问题归结为代码的线程规则。代码可能根本不支持线程化使用。只要遵循某些规则,代码可能支持线程化使用。他们唯一确定的方法是查阅代码的文档,当然希望其他人实际记录他们的线程模型


在对问题的评论中,您说:

我的问题是,当同时调用dll中的函数时,是否会为同一对象存储单独的数据属性


不,他们不会。如果有两个线程引用同一个对象,那么一个线程对该对象数据的修改将被另一个线程看到。

我认为这里没有足够的信息来回答您的问题。函数中堆栈上的任何内容都应该是安全的。您需要担心的其他问题(函数、类或全局级别的静态变量、堆内存、共享对象的成员变量等)。例如,如果这些函数中的每一个都创建了一个PhysicalLayer对象,完成了它的工作,然后退出,允许破坏PhysicalLayer,那么您可能就没事了。@charlie这些事情都得到了处理。但我没有在这里展示这些,因为这与我的问题无关。我的问题是,当同时调用dll中的函数时,是否会为同一对象存储单独的数据属性。这些函数可能会更改每个类属性。我认为这里没有足够的信息来回答您的问题。函数中堆栈上的任何内容都应该是安全的。您需要担心的其他问题(函数、类或全局级别的静态变量、堆内存、共享对象的成员变量等)。例如,如果这些函数中的每一个都创建了一个PhysicalLayer对象,完成了它的工作,然后退出,允许破坏PhysicalLayer,那么您可能就没事了。@charlie这些事情都得到了处理。但我没有在这里展示这些,因为这与我的问题无关。我的问题是,当同时调用dll中的函数时,是否会为同一对象存储单独的数据属性。这些函数可能会更改每个类属性。假设在一个线程中,我使用一些参数(如波特率)调用OpenRequest(),以初始化PhysicalLayer,而在另一个线程中,我使用不同的波特率作为参数调用同一个函数。我想做的是并行数据下载,但堆栈中并没有线程。我可以只使用物理层的一个对象从不同的COM端口下载数据吗?这完全取决于您使用的库的线程模型。这是我们没有的信息。下一个任务是找出线程模型。查阅图书馆文档。目前图书馆只支持从一个系统阅读。正如我所说,你需要遵守图书馆的规则。根据你所说的,我一点也不清楚它们在你心目中是什么。假设在一个线程中,我使用一些参数(如波特率)调用OpenRequest(),以初始化PhysicalLayer,而在另一个线程中,我使用不同的波特率作为参数调用同一个函数。我想做的是并行数据下载,但堆栈中并没有线程。我可以只使用物理层的一个对象从不同的COM端口下载数据吗?这完全取决于您使用的库的线程模型。这是我们没有的信息。下一个任务是找出线程模型。欺骗