首页 > 解决方案 > Swift 4:使用调用的 C++ 桥接函数杀死正在执行的线程

问题描述

我有 c++ API,它通过桥文件连接。在这个 API 中,有一个函数,令我遗憾的是,它有无限循环等待数据到达。

当用户单击开始按钮时,我通过以下方式调用此函数:

   workItem = DispatchWorkItem {
     foo()
   }
   DispatchQueue.global(qos: .background).async(execute: workItem!)

C++ 算法中的函数填充变量,特别是提供的数据数组。

当用户点击停止按钮时,我停止这个线程:

self.workItem?.cancel()

唯一的问题是它不会杀死这个线程并清理内存。我知道这一点,因为当用户再次单击开始按钮时,它会继续使用 c++ 数组中的旧数据

有没有办法杀死这个特定的线程并清理内存,以便在每次启动/停止时用户将启动新会话

标签: iosswiftmultithreading

解决方案


就 GCD 而言,WorkItem Cancel 只不过是dispatch_block_cancel的等价物。

从这个类比中可以看出,已经开始执行的块不会停止。只有等待执行的工作项可能会被停止。

停止时,您可能必须手动撤消 WorkItem 实际执行的操作,如果它之前已经执行过它。


推荐阅读