问题标签 [grand-central-dispatch]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
multithreading - pthreads 比 GCD 有什么优势吗?
最近学习了 Grand Central Dispatch,我发现多线程代码非常直观(使用 GCD)。我喜欢不需要锁的事实(以及它在内部使用无锁数据结构的事实),并且 API 非常简单。
现在,我开始学习 pthreads,我不禁对复杂性有点不知所措。线程连接、互斥体、条件变量——所有这些在 GCD 中都不是必需的,但在 pthread 中有很多 API 调用。
pthreads 比 GCD 有什么优势吗?是不是更有效率?是否存在 pthread 可以做 GCD 不能做的事情(不包括内核级软件)的正常用例?
在跨平台兼容性方面,我并不太在意。毕竟,libdispatch 是开源的,Apple 已将其闭包更改作为 GCC 的补丁提交,clang 支持闭包,并且已经(例如 FreeBSD),我们开始看到一些非 Apple 的 GCD 实现。我最感兴趣的是 API 的使用(具体的例子会很棒!)。
c - 为什么我的计算机在使用并行代码时没有显示加速?
所以我意识到这个问题听起来很愚蠢(是的,我使用的是双核),但是我尝试了两个不同的库(Grand Central Dispatch 和 OpenMP),并且在使用 clock() 来对代码进行计时时使用和不使用使它平行,速度是一样的。(为了记录,他们都使用自己的并行形式)。他们报告在不同的线程上运行,但也许他们在同一个核心上运行?有什么方法可以检查吗?(这两个库都是用于 C 的,我在较低层感到不舒服。)这非常奇怪。有任何想法吗?
c - Grand Central Dispatch 中的线程数和线程数
我正在使用 C 和 Grand Central Dispatch 来并行化一些繁重的计算。如何获取 GCD 使用的线程数?还有可能知道一段代码当前在哪个线程上运行吗?基本上我想对多个流使用sprng(并行随机数),为此我需要知道要使用的流ID(以及正在使用的线程)。
windows - Grand Central Dispatch (`libdispatch`) 能否在 Windows 上可用?
我正在研究多线程,GCD 似乎是一个比使用手动编写解决方案更好的选择pthread.h
and pthreads-win32
。然而,尽管它看起来libdispatch
要么正在开发,要么很快将要开发,大多数新的 POSIX 兼容系统......我不得不问,Windows 呢?libdispatch
移植到 Windows的机会有多大?阻止这种情况发生的障碍是什么?
如果归根结底,我需要做什么来进行搬运?
编辑:一些我已经知道的事情,开始讨论:
- 我们需要一个可以在 Windows 上编译的块兼容编译器,不是吗?PLBlocks 会处理这个问题吗?
- 我们可以使用 LLVM块运行时吗?
- 为了可移植性,我们不能用 APR 调用替换
pthread.h
用户空间中的所有依赖项吗?libdispatch
或者,或者,使用pthreads-win32
我想...</li>
编辑1:我听说这是完全不可能的,永远,因为libdispatch
依赖(以某种方式)kqueue
在Windows上无法使用......有人知道这是否属实吗?
applescript - GCD 和 AppleEvents / NSOperationQueue 和 AppleScript
据我了解,GCD 提供的线程确实有一个运行循环,但没有源/端口。现在我使用一些在 NSOperationQueue 中通过 AppleEvents 调用 AppleScripts 的方法。有时我的应用程序会因以下堆栈跟踪而崩溃。
我的问题:
- 在 NSInvocationOperation 或 NSBlockOperation 中使用 AppleScript
- 在 GCD 线程中使用 AppleEvents
- 在使用 AppleEvents 之前,我必须将源/端口添加到 gcd 线程的运行循环吗?
- 在使用 [CATransaction commit] 之前,我是否必须将源/端口添加到 gcd 线程的运行循环?
- 在使用 [NSObject performSelectorAfterDelay...] 之前,我是否必须将源/端口添加到 gcd 线程的运行循环?
- 如果是,如何?
- 我可以简单地调用 CFRunLoopRunInMode(kCFRunLoopDefaultMode, 5.0, false); /// 或 30 或 appleevent 定义的超时时间?
cocoa - 如何指定 NSDictionary 的 keysOfEntriesPassingTest 所需的块对象/谓词?
出于学习(尚不实用)的目的,我想在 NSDictionary 上使用以下方法,使用我定义的测试返回一组具有值的键。不幸的是不知道如何指定谓词。
例如,假设我所有的值都是 NSURL,我想取回端口 8080 上的所有 URL。这是我编写代码的尝试——尽管它对我来说并没有什么意义正确的:
那是因为我得到了以下编译器错误:
初始化 'void (^)(struct objc_object *, struct objc_object *, BOOL *)' 的不兼容块指针类型,预期 'BOOL (^)(struct objc_object *, struct objc_object *, BOOL *)'
我错过了什么?我会很感激一些文档的指针,这些文档更详细地介绍了谓词应该是的“块对象”。
谢谢!
这是有效的代码:
iphone - NSThread 与 NSOperationQueue 与 ??? 在 iPhone 上
目前我正在使用NSThread
在另一个线程中缓存图像。
交替:
或者,我可以使用NSOperationQueue
有什么理由放弃NSThread
吗?GCD 是为 iPhone 发布的第四个选项,但除非有显着的性能提升,否则我宁愿坚持在大多数平台上都可以使用的方法。
根据@Jon-Eric 的建议,我采用了NSOperationQueue
/NSOperation
子类解决方案。它工作得很好。该类NSOperation
足够灵活,您可以根据需要将其与调用、块或自定义子类一起使用。无论您如何创建您的NSOperation
,您都可以在准备好运行它时将其放入操作队列中。这些操作既可以作为放入队列的对象,也可以作为独立的异步方法运行,如果需要的话。由于您可以轻松地同步运行自定义操作方法,因此测试非常容易。
自从我提出这个问题以来,我已经在几个项目中使用了同样的技术,我对它保持我的代码和测试干净、有条理和愉快的异步方式感到非常满意。
A++++++++++++ 将再次子类化
scope - GCD / block scoping in Objective-C++
I'm using GCD to speed up some calculations in a few C++ templates I'm working on. I've already done it successfully for several functions, but now I'm trying to get it to work for a member function and I've encountered this weird scoping problem. The code looks something like this:
I understand that there might be some scoping issues when I'm accessing array elements like a._c1m[imodes2+jmodes+k], for instance (i.e. I might need to throw some pointers in there or something), but here's the real problem: when I declare NSIntegers like mi or just the looping indices j and k, for instance, the compiler gives me a ton of errors like the following:
'NSInteger op::mi' is not a static member of 'class op'
This has only happened to me for this member function--I implemented almost exactly the same technique on a friend function (with the same NSInteger declarations in the scope of the block) and it worked just fine.
The only fix I've been able to think up is declaring all of my looping variables outside the block as pointers and then dereferencing them in the scope of the block, but this strikes me as kind of a hack. Anybody know what's going on here?
Thanks in advance for your help!
macos - 在 Linux 中使用大型中央调度
这是可能的吗,因为Apple已经开源了代码(libdispatch
?)我对如何使用它感到有点困惑。这就像一个任何应用程序都可以使用的带有 API 的库,还是 Mac OS X 中内置的 OS 功能?可以单独为 Mac 和 iPhone(使用 iOS 4)构建的应用程序使用这个库吗?
我认为必须运行一个端口才能gcc
与 Apple 引入的新语义兼容。