一个套接字多线程

时间:2012-05-08 22:06:42

标签: c sockets protocols

我正在编写一个小复杂通信协议的一部分来控制来自单个计算机终端的多个医疗设备。计算机终端需要管理大约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

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

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

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

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

1 个答案:

答案 0 :(得分:0)

让多个线程处理单个套接字没有任何内在错误;然而,围绕这一个非常一般的想法有许多好的和坏的设计。如果您不想在编写应用程序时重新发现问题,我建议您搜索最适合您计划的特定数据包处理方式的设计。

单个线程处理单个套接字也没有任何内在错误;但是,如果你把逻辑处理放在那个线程上,那么你选择了一个糟糕的设计,因为那个线程在最后一次请求“工作”时无法处理请求。

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

  1. 它将处理一个部分数据包,其中包含数据的第一部分。
  2. 它将错误处理后续数据包,因为缓冲区中的信息不会以有效数据包标头开头。
  3. 这些失败在遇到之前很难设想和诊断。也许您的库已经缓冲并拆分消息,也许不是。

    简而言之,您的设计并不取决于访问套接字的线程数:访问套接字的线程数量取决于您的设计。