3

我正在编写一个点对点蓝牙聊天应用程序。我目前正在做的是:

let thread = Thread(block: { [weak self] in
    guard let `self` = self else { return }

    self.channel.inputStream.delegate = self
    self.channel.inputStream.schedule(in: .current, forMode: .defaultRunLoopMode)
    self.channel.inputStream.open()

    self.channel.outputStream.delegate = self
    self.channel.outputStream.schedule(in: .current, forMode: .defaultRunLoopMode)
    self.channel.outputStream.open()

    RunLoop.current.run()
})

thread.start()

我目前面临self.channelCBL2CAPChannel 问题是它为每对通道生成新线程,最终有太多线程挂起。

在这种情况下设置CBL2CAPChannels 的正确方法是什么?Apple 的文档为此使用了主线程,这是出乎意料的,当有很多连接时可能会导致问题。

4

1 回答 1

2

Apple 的文档为此使用了主线程,这是出乎意料的,当有很多连接时可能会导致问题。

这并不意外。这是完全正常的。您不应该为每个流创建单独的线程。运行循环的全部意义在于在不创建新线程的情况下处理并发。在运行循环编程中,您很少创建新线程。运行循环编程早在多核系统之前就出现了,并且是为协作多任务(而不是抢占式多任务)而设计的。

即使你想把事情放到其他内核上,你也不应该创建一个Thread对象,除非你正在与需要它的 C++ 代码交互。NSThread近十年来没有太多直接使用的充分理由。您使用 DispatchQueue 将工作传递给 GCD。将数据从流传递到另一个调度队列进行处理是一种非常正常的方法,并且几乎所有的工作都从主队列中取出(然后主队列只是进行协调)。

如果您有大量连接,或者它们非常繁忙,那么您可以考虑将它们全部放在一个单独的线程上(不是每个连接一个线程;总共一个线程)。但在 L2CAP 费率下,您不太可能需要这样做。我为 G4s 构建的 Mac 聊天应用程序不如单线程 iPhone 5 强大。

于 2018-12-10T14:32:11.173 回答