我在Swift 2.x(甚至1.x)项目中有很多代码,如下所示:
// Move to a background thread to do some long running work
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) {
let image = self.loadOrGenerateAnImage()
// Bounce back to the main thread to update the UI
dispatch_async(dispatch_get_main_queue()) {
self.imageView.image = image
}
}
Run Code Online (Sandbox Code Playgroud)
或者像这样的东西来延迟执行:
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, Int64(0.5 * Double(NSEC_PER_SEC))), dispatch_get_main_queue()) {
print("test")
}
Run Code Online (Sandbox Code Playgroud)
或者Grand Central Dispatch API的各种其他用途......
现在我已经在Swift 3的Xcode 8(beta)中打开了我的项目,我得到了各种各样的错误.其中一些提供修复我的代码,但并非所有修复产生工作代码.我该怎么办?
libdispatch grand-central-dispatch dispatch-async swift swift3
好的,所以我在Xcode 8中发现了新的Swifty Dispatch API.我很开心使用DispatchQueue.main.async,我一直在浏览DispatchXcode中的模块以找到所有新的API.
但我也用它dispatch_once来确保像单例创建和一次性设置这样的事情不会被多次执行(即使在多线程环境中)......并且dispatch_once在新的Dispatch模块中找不到它?
static var token: dispatch_once_t = 0
func whatDoYouHear() {
print("All of this has happened before, and all of it will happen again.")
dispatch_once(&token) {
print("Except this part.")
}
}
Run Code Online (Sandbox Code Playgroud) 我期待到多线程,和GCD似乎是一个很大比使用手工编写的解决方案更好的选择pthread.h和pthreads-win32.然而,虽然看起来libdispatch要么正在开发,要么很快就要开始工作,大多数新的POSIX兼容系统......我不得不问,Windows呢?libdispatch移植到Windows 的可能性有多大?阻止这种情况发生的障碍是什么?
如果它归结为它,我需要做什么来预成型portage?
编辑:我已经知道的一些事情,以便开始讨论:
pthread.h用户空间中的所有依赖项libdispatch吗?或者,或者,使用pthreads-win32我想...编辑1:我听说这是完全和完全不可能的,因为libdispatch依赖(某种程度上)kqueue,在Windows上无法提供...有人知道这是真的吗?
windows multithreading portability libdispatch grand-central-dispatch
我很想尝试大型中央调度,但我必须开发的是Ubuntu工作站.是libdispatch,以及c/obj-c等的块扩展......可以在linux上使用吗?如果是这样,我该如何获得它们?
以下代码将占用~410MB的内存,不会再次释放.(使用的版本dispatch_sync代替dispatch_async将需要~8MB内存)
我预计会有高内存使用率的飙升,但它应该再次下降......泄漏在哪里?
int main(int argc, const char * argv[]) {
@autoreleasepool {
for (int i = 0; i < 100000; i++) {
dispatch_async(dispatch_get_global_queue(QOS_CLASS_UTILITY, 0), ^{
NSLog(@"test");
});
}
NSLog(@"Waiting.");
[[NSRunLoop mainRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:60]];
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我试过了:
NSRunLoop run循环我尝试了几种组合,从未看到内存减少(即使在等待几分钟后).我知道GCD参考指南,其中包含以下声明:
尽管GCD调度队列具有自己的自动释放池,但它们无法保证这些池何时耗尽.
这段代码中是否有内存泄漏?如果没有,有没有办法强制队列释放/排出已完成的块?
memory-leaks libdispatch grand-central-dispatch dispatch-async
我有时会在libdispatch内部发生崩溃,并且该SecItemCopyMatching函数会产生以下回溯.
* thread #1: tid = 0x169ee8, 0x0374c830 libdispatch.dylib`_dispatch_semaphore_wait_slow + 278, queue = 'com.apple.main-thread, stop reason = EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)
frame #0: 0x0374c830 libdispatch.dylib`_dispatch_semaphore_wait_slow + 278
frame #1: 0x0374c711 libdispatch.dylib`dispatch_semaphore_wait + 37
frame #2: 0x03921b54 libxpc.dylib`xpc_connection_send_message_with_reply_sync + 231
frame #3: 0x01448e99 Security`securityd_message_with_reply_sync + 78
frame #4: 0x01449098 Security`securityd_send_sync_and_do + 81
frame #5: 0x01459926 Security`__SecItemCopyMatching_block_invoke + 218
frame #6: 0x014589f9 Security`SecOSStatusWith + 37
frame #7: 0x014597da Security`SecItemCopyMatching + 208
frame #8: 0x0022b482 MyApp`+[BITKeychainUtils getPasswordForUsername:andServiceName:error:](self=0x00399e3c, _cmd=0x002d21e0, username=0x003a336c, serviceName=0x0c17c420, error=0xbfffeb24) + …Run Code Online (Sandbox Code Playgroud) 我编译了libdispatch.这段代码有效:
import Dispatch
var lockQueue = dispatch_queue_create("com.test.async", nil);
Run Code Online (Sandbox Code Playgroud)
但是如果我把这段代码放到结束文件中:
dispatch_async(lockQueue) {
print("test1");
}
Run Code Online (Sandbox Code Playgroud)
我收到一个错误:
使用未解析的标识符'dispatch_async'
随着 OpenCL 2.0 的推出,OpenCL 似乎具备了 Grand Central Dispatch (GCD) 的许多特性,例如 CLang/Apple 风格的块和队列。查看它们各自的功能集,我想知道 OpenCL 是否可以完成 GCD/libdispatch 可以做的所有事情,但是增加了将计算引导到 GPU 和 CPU 的能力——或者 GCD 是否可以提供更多与众不同的功能来自 OpenCL。
具体我的问题是:
GCD 和 OpenCL 的并发特性有什么区别?
如果一起使用它们有价值(假设 GCD 提供附加功能),C 块是否可以路由到 GCD 队列或 OpenCL 队列?如果以 CPU 为目标,是否有理由通过 OpenCL 与直接运行
OpenCL 2.0 是否提供 GCD 风格的负载平衡,可以填充跨越 CPU 和 GPU 的线程?
concurrency opencl libdispatch grand-central-dispatch objective-c-blocks
我正在编译 Apple libdispatch。但出现错误Error: unable to find SDK 'macosx.internal'(in target ' libdispatch ')
有没有人有过此错误的经验?
据我所知,GCD只会根据需要创建尽可能多的线程以充分利用CPU.在dispatch_async用于启动大约30个后台任务的代码中,我看到活动监视器中的线程数量大约增加了30个.我不会想到,因为它只是一个双核PC.
我确定我误会了什么.有人能告诉我发生了什么事吗?
我正在使用pynetdicom库来接收和处理医学 dicom 图像。在回调函数“on_association_released”中进行处理。但是,在接收某些研究时,它会由于似乎是子线程崩溃而导致 Python 崩溃。
从 OSX 崩溃报告来看,似乎是 libdispatch 库是原因,但不确定如何或为什么。
这是函数:
def on_association_released(self):
if not self.auto_process:
self.incoming = []
return
dicoms = [Dicom(f=x) for x in self.incoming]
self.incoming = []
incoming = Study(dicom_list=dicoms)
log.info("Incoming study: {incoming}".format(**locals()))
completed_tasks = {}
time.sleep(1)
for task in AVAILABLE_PROCESS_TASKS:
log.info("Trying task: {task}".format(**locals()))
process_task = task(study=incoming)
try:
if process_task.valid:
log.info("{incoming} is valid for {process_task}".format(**locals()))
try:
process_task.process()
except Exception as e:
log.warning(
'Failed to perform {process_task} on {incoming}: \n {e}'.format(**locals())
)
else:
log.info("Completed {process_task} for …Run Code Online (Sandbox Code Playgroud) libdispatch ×11
swift ×3
linux ×2
macos ×2
swift3 ×2
concurrency ×1
crash ×1
memory-leaks ×1
multicore ×1
opencl ×1
portability ×1
pynetdicom ×1
python ×1
python-3.x ×1
windows ×1
xcode ×1