gpt4 book ai didi

c - 一个套接字多个线程

转载 作者:行者123 更新时间:2023-11-30 18:00:22 24 4
gpt4 key购买 nike

我正在编写一部分复杂的通信协议(protocol),以从单个计算机终端控制多个医疗设备。计算机终端需要管理大约20个这样的设备。每个设备都使用相同的通信协议(protocol)(称为 DEP)。现在,我创建了一个循环,该循环在不同设备中进行多路复用以发送请求并接收与特定设备关联的患者数据。所以这个循环的结构一般来说是这样的:

Begin Loop
Select Device i
if Device.Socket has Data
Strip Header
Copy Data on Queue
end if

rem_time = TIMEOUT - (CurrentTime - Device.Session.LastRequestTime)
if TIMEOUT <= 0
Send Re-association Request to Device
else
Sort Pending Request According to Time
Select First Request
Send the Request
Set Request Priority Least
end Select
end if
end Select
end Loop

我可能在上面的伪代码中犯了一些错误,但我希望我已经清楚这个循环想要做什么。我有优先级列表结构,用于选择设备和该设备的待处理请求,以便以良好的最佳间隔选择所有请求和设备。

我忘了提一下,上面的循环实际上并没有解析接收到的数据,而只是剥离了 header 并将其放入队列中。队列中的数据在不同的线程中解析并记录在文件或数据库中。

我希望添加一个功能,以便其他计算机也可以导入数据并远程控制连接到计算机终端的设备。为此,我需要创建套接字来监听此无限循环中的命令,并在执行解析的不同线程中发送数据。

现在,我向所有并发专家提出的问题是:使用单个套接字在两个不同的线程中进行读写是一个好的设计吗?每个线程都将严格参与读取或写入,而不是同时参与两者。另外,我相信套接字是在进程级别同步的,所以我是否需要锁来同步不同线程对一个套接字的读写?

最佳答案

让多个线程处理单个套接字本身并没有什么问题;然而,基于这一非常普遍的想法,有许多好的和坏的设计。如果您不想在编写应用程序时重新发现问题,我建议您四处寻找最适合您计划的特定数据包处理风格的设计。

让单个线程处理单个套接字也没有本质上的错误;但是,如果您将逻辑处理放在该线程上,那么您选择了一个糟糕的设计,因为该线程在处理最后一个请求时无法处理请求。

在您的特定代码中,您可能会遇到问题。如果您的数据包支持分段,或者即使您的算法由于计时问题而稍微领先于硬件,您也可能只有部分数据包“收到”在缓冲区中。在这种情况下,您的算法将以两种方式失败。

  1. 它将处理部分数据包,其中包含数据的第一部分。
  2. 它将错误处理后续数据包,因为缓冲区中的信息不会以有效的数据包 header 开头。

此类故障在遇到之前很难想象和诊断。也许您的库已经缓冲和分割消息,也许还没有。

简而言之,您的设计并不取决于有多少线程访问您的套接字:有多少线程访问您的套接字是由您的设计决定的。

关于c - 一个套接字多个线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10507255/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com