ios - Swift 4:使用调用的 C++ 桥接函数杀死正在执行的线程
问题描述
我有 c++ API,它通过桥文件连接。在这个 API 中,有一个函数,令我遗憾的是,它有无限循环等待数据到达。
当用户单击开始按钮时,我通过以下方式调用此函数:
workItem = DispatchWorkItem {
foo()
}
DispatchQueue.global(qos: .background).async(execute: workItem!)
C++ 算法中的函数填充变量,特别是提供的数据数组。
当用户点击停止按钮时,我停止这个线程:
self.workItem?.cancel()
唯一的问题是它不会杀死这个线程并清理内存。我知道这一点,因为当用户再次单击开始按钮时,它会继续使用 c++ 数组中的旧数据
有没有办法杀死这个特定的线程并清理内存,以便在每次启动/停止时用户将启动新会话
解决方案
就 GCD 而言,WorkItem Cancel 只不过是dispatch_block_cancel的等价物。
从这个类比中可以看出,已经开始执行的块不会停止。只有等待执行的工作项可能会被停止。
停止时,您可能必须手动撤消 WorkItem 实际执行的操作,如果它之前已经执行过它。
推荐阅读
- typescript - 上传到 graphql 的文件会自动解析,除非它们在对象内。这是错误还是预期行为?
- html - 响应式设计和网格:我应该把导航栏放在哪里?
- android - 设备可能具有与当前版本不匹配的陈旧 dexed jar(dexopt 错误)
- ios - XCUITest XCUIElementQuery 模态视图中缺少所有非静态文本元素
- ios - QLPreviewController 检测 QLPreviewItem 何时更改
- jquery - 如何使用jquery动态更改以禁用切换器
- typescript - 在 TS 中处理事件 - 无过载
- javascript - 获取用户的身份验证状态返回意外结果
- apache-spark - 如何处理超长线的火花任务?
- reactjs - 将组合框绑定到共享点列表