从多个线程调用 c++ dll 中的函数的效果

Effect of calling Functions in c++ dll from multiple threads

本文关键字:函数 dll c++ 线程 调用      更新时间:2023-10-16

我有一个C++协议栈dll(用于串行通信),它将一个类公开给前端应用程序。公开的类如下所示:

class ProtocolStack
{
public :
    void OpenRequest(Params);
    void SendData(Params);
    void CloseRequest(Params);
};

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

class PhysicalLayer
{
private:
    int Baud_rate;
    string PortName;
public:
    void Send(string);
    void Receive();
 };

我想使用相同的协议栈从不同的系统并行读取数据。如果我创建协议栈的单个对象用于并行读取(从不同的端口),当从不同的线程同时调用相同的函数时,为每个函数调用分配的数据段会不同吗?

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

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

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

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

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


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

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

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