gpt4 book ai didi

multithreading - GCD 中的序列化优先级队列

转载 作者:行者123 更新时间:2023-12-03 22:41:45 32 4
gpt4 key购买 nike

我有一段来自 API 黑暗时代的现有代码。它是一个基于 MPCreateTask 的线程。看起来我可以将其移至 GCG 队列,但有点复杂。当前有三个基于 MPCreateQueue 的队列用于三个优先级。

在 GCD 中,我发现并测试了以下代码作为 GCD 重构的概念证明(天哪,我讨厌这个词,但它很合适)。

首先,这是否会按照我的预期进行,即所有操作( block 输入到例程)将是连续的。操作将具有调度它们的例程指定的优先级。

其次,有没有更好的方法来做到这一点?

// set up three serial queues
dispatch_queue_t queueA = dispatch_queue_create("app.queue.A" , DISPATCH_QUEUE_SERIAL);
dispatch_queue_t queueB = dispatch_queue_create("app.queue.B" , DISPATCH_QUEUE_SERIAL);
dispatch_queue_t queueC = dispatch_queue_create("app.queue.C" , DISPATCH_QUEUE_SERIAL);

// set the target queues so that all blocks posted to any of the queues are serial
// ( the priority of the queues will be set by queueC.
dispatch_set_target_queue( queueB, queueC ) ;
dispatch_set_target_queue( queueA, queueB ) ;

void lowPriorityDispatch( dispatch_block_t lowAction )
{
dispatch_async( queueC, ^{
lowAction() ;
}) ;
}
void mediumPriorityDispatch( dispatch_block_t mediumAction )
{
dispatch_async( queueB, ^{
dispatch_suspend( queueC) ;
mediumAction() ;
dispatch_resume( queueC ) ;
}) ;
}
void highPriorityDispatch( dispatch_block_t highAction )
{
dispatch_async( queueA, ^{
dispatch_suspend( queueC) ;
dispatch_suspend( queueB) ;
highAction() ;
dispatch_resume( queueB ) ;
dispatch_resume( queueC ) ;
}) ;
}

最佳答案

我不确定是否有人已经为您提供了答案,但请不要这样做。充其量,您只需为此处的三个队列设置优先级。最坏的情况是,你什么都不做。 GCD 具有为每个队列创建优先级的工具。请参见 dispatch_queue_attr_make_with_qos_class dispatch_queue_attr_make_with_qos_class .

更好的解决方案是:

dispatch_queue_attr_t highPriorityAttr = dispatch_queue_attr_make_with_qos_class (DISPATCH_QUEUE_SERIAL, QOS_CLASS_USER_INITIATED,-1);
dispatch_queue_t queueA = dispatch_queue_create ("app.queue.A",highPriorityAttr);

dispatch_queue_attr_t mediumPriorityAttr = dispatch_queue_attr_make_with_qos_class (DISPATCH_QUEUE_SERIAL, QOS_CLASS_UTILITY,-1);
dispatch_queue_t queueB = dispatch_queue_create ("app.queue.B",mediumPriorityAttr);

dispatch_queue_attr_t lowPriorityAttr = dispatch_queue_attr_make_with_qos_class (DISPATCH_QUEUE_SERIAL, QOS_CLASS_BACKGROUND,-1);
dispatch_queue_t queueC = dispatch_queue_create ("app.queue.C",lowPriorityAttr);

然后像这样使用每一个:

dispatch_async(queueA,highAction);
dispatch_async(queueB,mediumAction);
dispatch_async(queueC,lowAction);

关于multithreading - GCD 中的序列化优先级队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23848046/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com