【问题标题】:NSOperationQueue Pause & Resume?NSOperationQueue 暂停和恢复?
【发布时间】:2014-03-19 12:21:35
【问题描述】:

我使用NSOperationQueue 实现了线程池。其中我将maxConcurrentOperationCount 设置为25。即同时同时运行 25 个线程。

我正在使用NSOperationQueue 将块上传到服务器。因此,块被分配给前 25 个线程。在NSOperationQueue 满后,我想暂停分块读取部分,然后每当队列中的线程完成时,恢复分块部分以将新线程分配给NSOperationQueue 以替换完成的线程。

我的代码:

NSOperationQueue *operationQueue = [NSOperationQueue new];
operationQueue.maxConcurrentOperationCount=5;

NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self                                                                         selector:@selector(upload:)                                                                            object:f_objChunkDetails->FileStream];

NSUInteger oprCnt=operationQueue.operationCount;

if(oprCnt >= 5) {
    // wait till queue has a free slot
} else {
    [operationQueue addOperation:operation];
}

那么NSOperationQueue中如何使用暂停和恢复呢?如何在 Objective-C 中实现ManualResetEvent

【问题讨论】:

    标签: multithreading macos nsoperation nsoperationqueue manualresetevent


    【解决方案1】:

    不要等待或暂停。相反,将您的工作创造(和检查)转移到一种新方法中。该方法应该循环创建作业,直到可用限制,然后返回。创建的每个作业都应该添加一个completionBlock,它会调用作业创建方法。

    这样你是事件触发而不是阻塞。

    一般情况下,completionBlock应该在调用job创建方法之前切换到主线程。

    【讨论】:

    • 目前我正在使用 NSOperationQueue 实现上传部分,因此将数据上传到服务器需要时间。要上传的数据来自快速执行的 ReadData 类。所以我想暂停 ReadData如果队列包含空间,则直到 NSOperationQueue 有空间 ReadData 开始工作并将下一个数据分配给 NSOperationQueue.. 在 C# 中,它使用 ManualResetEvent 类实现。什么是objective-c的可行解决方案?多线程如何实现ManualResetEvent?
    • 如果你不喜欢我上面的解决方案,你可以使用NSConditionLock
    • 我喜欢你的解决方案,但还有其他方法可以做到这一点。我想要可行的解决方案。 NSConditionLock 或 NSLock 共享资源...我想分别暂停和恢复我的每个线程..据我所知 NSConditionLock 不会实现这一点..如果您认为 NSConditionLock 是更好的选择,那么您能否提供我的示例代码。 .. 就像在c# 中我们使用ManualResetEvent 类,它使用set、Reset、waitOne 方法来暂停和恢复...什么是objective-c(MAC) 的合适选项。请提出您宝贵的建议...
    • 我的回答是可行的非阻塞解决方案。如果您想要一个阻塞解决方案,那么NSConditionLock 可以用作计数信号量。 dispatch_semaphore_t也可以。
    猜你喜欢
    • 2013-07-19
    • 2015-07-28
    • 2014-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多