- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
以下是我所知道和理解的:
全局队列是一个并发队列,可以将任务分派(dispatch)给多个线程。不保证执行任务的顺序。例如:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), {
for (int i; i<10; i++) {
doTask()
}
})
如果我想分派(dispatch)到串行队列,我可以使用
dispatch_async(dispatch_queue_create("my.serial.queue", nil) {
...
}
每次只有一个任务被分派(dispatch)到一个线程并被执行。顺序是先进先出。
=====我很困惑&不完全理解=======
主线程有一个NSRunLoop,在主线程中循环执行任务。我想知道调度队列和运行循环之间的关系是什么?我可以理解为,如果将任务分派(dispatch)给主线程,主线程的 NSRunLoop 获取分派(dispatch)的任务并执行它吗?
将任务分派(dispatch)给多个线程的全局队列呢? iOS/OSX 系统是否不仅会自动创建线程,还会为每个线程创建 NSRunLoop?然后每个线程中的运行循环从全局队列中获取调度的任务并执行它?
谁知道线程? dispatch_async()
和 dispatch_sync()
函数是否知道将任务分派(dispatch)给哪个线程,或者 queue 是否知道将任务分派(dispatch)给哪个线程?
有没有办法以编程方式从调度队列中获取线程(任务被调度到的线程)的 NSRunLoop 对象? (这个问题与问题3有关)
最佳答案
主线程的运行循环有一个步骤,它运行在主队列中排队的任何 block 。你可能会发现 this answer如果您想详细了解运行循环的作用,这很有用。
GCD 为并发队列创建线程。一个线程没有运行循环,直到线程上运行的东西第一次请求线程的运行循环,此时系统为线程创建一个运行循环。然而,运行循环仅在该线程上的某些东西要求它运行时运行(通过调用 -[NSRunLoop run]
或 CFRunLoopRun
或类似的)。大多数线程,包括为 GCD 队列创建的线程,从来没有运行循环。
GCD 管理一个线程池,当它需要运行一个 block 时(因为它被添加到某个队列),GCD 会选择运行该 block 的线程。 GCD 的线程选择算法主要是一个实现细节,除了它会总是为添加到主队列的 block 选择主线程。 (请注意,GCD 有时也会将主线程用于添加到其他队列的 block 。)
只能获取主线程的run loop(使用+[NSRunLoop mainRunLoop]
或CFRunLoopGetMain
)或者当前线程的run loop(使用 +[NSRunLoop currentRunLoop]
或 CFRunLoopGetCurrent
)。如果您需要某个任意线程的运行循环,您必须找到一种方法在该线程上调用 CFRunLoopGetCurrent
并以安全、同步的方式跨线程传回其返回值。
请注意NSRunLoop
接口(interface)不是线程安全的,但是CFRunLoop
接口(interface)是线程安全的,所以如果你需要访问另一个线程的运行循环,你应该使用CFRunLoop
接口(interface)。
另请注意,您可能不应该在 GCD 队列上运行的 block 内运行运行循环很长时间,因为您正在占用 GCD 期望控制的线程。如果你需要长时间运行一个run loop,你应该为它启动自己的线程。您可以在 the _legacyStreamRunLoop
function in CFStream.c 中看到这样的示例.请注意它如何使专用线程的运行循环在名为 sLegacyRL
的静态变量中可用,它在 dispatch_semaphore_t
的保护下进行初始化。
关于ios - 需要一些关于调度队列、线程和 NSRunLoop 的说明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38000727/
崩溃发生在以下代码中: void CocoaCommRequest::launchSync() { launchAsync(); while (![_delegate finished
我的 iPhone 应用程序中有几个选项卡,需要几秒钟的时间才能加载(从本地 sqlite 数据库中提取大量数据)。当用户触摸选项卡时,应用程序似乎什么也没做。我试图放置一个显示旋转器的窗口,但是由于
我开始将 RunLoop 理解为类似于 Java 中的事件队列。我现在尝试做的 Wgat,只是为了更好地理解,是在运行自己的 RunLoop 的应用程序中创建一个后台线程。我在示例 ViewContr
我制作了一个带有计时器的 RunLoop,该计时器更新显示倒计时的标签。我需要 RunLoop 在倒计时达到零时停止,对于计时器正常完成的情况,我可以使用 runUntilDate,日期为当前日期 +
我在线程中有一个连接,因此我将其添加到运行循环中以获取所有数据: [[NSRunLoop currentRunLoop] run]; [connection scheduleInRunLoop
我有一个每 5 分钟调用一次的后台方法。 该方法使用NSURLConnection将数据发送到 Web 服务。 在那种方法中,我有这个代码: ... conn = [[NSURLConnection
我对 NSRunLoop 的实现很感兴趣,它可以在不占用大量 CPU 的情况下让线程空闲/休眠。这在 Objective-c 中是如何实现的?消耗高 CPU 的简单解决方案是 while(YES) {
在我的应用程序中,我需要对 restful web api 进行 https 调用并在返回时处理结果。同时服务调用的数量从来都不是固定的,因此相应地编写了相关代码。从服务获取的数据临时存储在应用程序内
我在自定义单元格上使用 NSTimer 运行 NSRunLoop 以持续更新“有效至”UILabel。它工作正常,直到我关闭 tableView,NSRunLoop 继续倒计时。我使用 dealloc
我不太清楚 NSRunLoop 是否线程安全。所以我需要澄清一下它是否线程安全,为什么? 任何帮助都是可观的。 最佳答案 在 NSRunLoop 的开头有一个警告 official reference
谁能解释一下什么是NSRunLoop?据我所知,NSRunLoop 是与 NSThread 相关的东西,对吗?所以假设我创建了一个像 这样的线程 NSThread* th=[[NSThread all
我刚刚在我的 ViewController 中使用 NSRunLoop 和 NSTimer 创建了一个带计时器的后台任务: - (void)runBackgroundTask: (int) time{
我读了很多关于 NSRunLoop 的帖子,比如 this , this , this .但无法弄清楚 NSRunLoop 实际上做了什么 我平时看到的是工作线程 wthread = [[NSThre
谁能解释什么是NSRunLoop?所以据我所知 NSRunLoop 是与 NSThread 相关的东西,对吗?所以假设我创建了一个像 这样的线程 NSThread* th=[[NSThread all
我试图在守护进程结束时或者有人退出该进程时释放在守护进程中分配的资源。 可以说, int main(int argc, const char * argv[]) { Controller *c
在 Cocoa 应用程序中,运行如下代码: NSDate* date = [NSDate dateWithTimeIntervalSinceNow:30.0]; while (date.timeInt
我买了《Big Nerd Ranch Guide for Objective-C》,但有一些关于 NSRunLoop 的内容我不明白。 这是书中的一段代码: NSTimer *timer = [NST
假设我有 2 个线程,一个是主线程,另一个是辅助线程。主线程使用最多,但有时(很少)我希望辅助线程根据主线程的调用执行一些工作。大多数时候辅助线程应该休眠。现在,经过一番搜索,我明白做到这一点的方法是
我正在编写一个应用程序,它必须与通过 USB 连接的设备进行通信。该应用程序按固定时间轮流从设备发送和接收数据。所有 Rx/Tx 都发生在单独的线程中,否则 UI 将被阻塞。基本结构基本上是这样的。
我正在使用 NSUrlConnection 来发出 http 请求。我想避免使用事件驱动代码,所以我通过以下方式使用 NSRunloop: NSURLRequest *request = [[NSUR
我是一名优秀的程序员,十分优秀!