0

我正在编写一个复杂的通信协议的一部分,以从单个计算机终端控制多个医疗设备。计算机终端需要管理大约20个这样的设备。每个设备都使用相同的协议进行通信,称为 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

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

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

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

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

4

1 回答 1

0

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

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

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

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

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

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

于 2012-05-08T22:52:00.513 回答