如何在 Kotlin Native 中设置协程调度程序的线程优先级

How to set thread priority of a coroutine dispatcher in Kotlin Native

我在我的多平台 (android + iOS) 应用程序中使用协程。为了能够使用多线程协程,我正在使用 native-mt 构建。所以现在我需要创建一个在高优先级线程上运行的 CoroutineDispatcher 。 android 我是这样做的

val thread = HandlerThread("myThread", -20).also {
    it.start()
}
val highPriorityDispatcher = Handler(thread.looper).asCoroutineDispatcher()

有没有办法在 iOS 上创建类似的高优先级调度程序?

首先,我尝试使用 newSingleThreadContext. In k/n the resulting dispatcher exposes its Worker 创建一个新的调度程序,但我还没有找到任何设置工作人员优先级的方法。 我还尝试使用 setThreadPriority 方法提高线程优先级:

val highPriorityDispatcher = newSingleThreadContext("myThread").also {
    scope.launch(it){
        NSThread.setThreadPriority(1.0)
    }
}

但是好像没有达到应有的效果

我正在考虑使用 dispatch_queue 编写自定义调度程序,但这似乎是一项非常重要的任务。因此,如果能找到更简单的方法来解决此问题,我们将不胜感激。

好吧,其实我好像错了

val highPriorityDispatcher = newSingleThreadContext("myThread").also {
    scope.launch(it){
        NSThread.setThreadPriority(1.0)
    }
}

完成工作并实际更改优先级,在 iOS 分析器中确认。 最后我还加了

  pthread_set_qos_class_self_np(QOS_CLASS_USER_INTERACTIVE, 0)

调用以设置 QoS。我使用了 pthread 版本,因为 here 它说

NSThread possesses a qualityOfService property, of type NSQualityOfService. This class will not infer a QoS based on the context of its execution, so the value of this property may only be changed before the thread has started. Reading the qualityOfService of a thread at any time provides its current value.