标签: libdispatch

如何在Swift 3,Swift 4及更高版本中dispatch_sync,dispatch_async,dispatch_after等?

我在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

230
推荐指数
6
解决办法
18万
查看次数

Swift 3中的dispatch_once是哪一个?

好的,所以我在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)

libdispatch grand-central-dispatch swift swift3

49
推荐指数
5
解决办法
3万
查看次数

可以在Windows上使用Grand Central Dispatch(`libdispatch`)吗?

我期待到多线程,和GCD似乎是一个很大比使用手工编写的解决方案更好的选择pthread.hpthreads-win32.然而,虽然看起来libdispatch要么正在开发,要么很快就要开始工作,大多数新的POSIX兼容系统......我不得不问,Windows呢?libdispatch移植到Windows 的可能性有多大?阻止这种情况发生的障碍是什么?

如果它归结为它,需要做什么来预成型portage?

编辑:我已经知道的一些事情,以便开始讨论:

  • 我们需要一个可以在Windows上编译的块兼容编译器,不是吗?将PLBlocks处理这个问题?
  • 我们可以使用LLVM 块运行时吗?
  • 为了便携性,我们不能用APR调用替换pthread.h用户空间中的所有依赖项libdispatch吗?或者,或者,使用pthreads-win32我想...

编辑1:我听说这是完全和完全不可能的,因为libdispatch依赖(某种程度上)kqueue,在Windows上无法提供...有人知道这是真的吗?

windows multithreading portability libdispatch grand-central-dispatch

16
推荐指数
3
解决办法
4687
查看次数

是否可以在linux上使用块和libdispatch?

我很想尝试大型中央调度,但我必须开发的是Ubuntu工作站.是libdispatch,以及c/obj-c等的块扩展......可以在linux上使用吗?如果是这样,我该如何获得它们?

linux libdispatch

13
推荐指数
2
解决办法
6553
查看次数

GCD dispatch_async内存泄漏?

以下代码将占用~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)

我试过了:

  • 在循环内部和内部添加@autoreleasepool
  • 添加NSRunLoop run循环

我尝试了几种组合,从未看到内存减少(即使在等待几分钟后).我知道GCD参考指南,其中包含以下声明:

尽管GCD调度队列具有自己的自动释放池,但它们无法保证这些池何时耗尽.

这段代码中是否有内存泄漏?如果没有,有没有办法强制队列释放/排出已完成的块?

memory-leaks libdispatch grand-central-dispatch dispatch-async

9
推荐指数
1
解决办法
1850
查看次数

libdispatch _dispatch_semaphore_wait_slow崩溃

我有时会在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)

crash libdispatch

6
推荐指数
1
解决办法
1902
查看次数

Linux中的Swift:使用未解析的标识符'dispatch_async'

我编译了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'

linux libdispatch swift

5
推荐指数
1
解决办法
1106
查看次数

OpenCL 与 Grand Central Dispatch 中的并发编程

随着 OpenCL 2.0 的推出,OpenCL 似乎具备了 Grand Central Dispatch (GCD) 的许多特性,例如 CLang/Apple 风格的块和队列。查看它们各自的功能集,我想知道 OpenCL 是否可以完成 GCD/libdispatch 可以做的所有事情,但是增加了将计算引导到 GPU 和 CPU 的能力——或者 GCD 是否可以提供更多与众不同的功能来自 OpenCL。

具体我的问题是:

  1. GCD 和 OpenCL 的并发特性有什么区别?

  2. 如果一起使用它们有价值(假设 GCD 提供附加功能),C 块是否可以路由到 GCD 队列或 OpenCL 队列?如果以 CPU 为目标,是否有理由通过 OpenCL 与直接运行

  3. OpenCL 2.0 是否提供 GCD 风格的负载平衡,可以填充跨越 CPU 和 GPU 的线程?

concurrency opencl libdispatch grand-central-dispatch objective-c-blocks

4
推荐指数
1
解决办法
1854
查看次数

Xcode 错误:无法找到 sdk 'macosx.internal'(在目标 'libdispatch' 中)

我正在编译 Apple libdispatch。但出现错误Error: unable to find SDK 'macosx.internal'(in target ' libdispatch ')

有没有人有过此错误的经验?

xcode libdispatch

4
推荐指数
1
解决办法
2719
查看次数

Grand Central Dispatch应创建多少个主题?

据我所知,GCD只会根据需要创建尽可能多的线程以充分利用CPU.在dispatch_async用于启动大约30个后台任务的代码中,我看到活动监视器中的线程数量大约增加了30个.我不会想到,因为它只是一个双核PC.

我确定我误会了什么.有人能告诉我发生了什么事吗?

macos multicore libdispatch grand-central-dispatch

2
推荐指数
1
解决办法
1265
查看次数

由于 libdispatch 崩溃子线程,Python 崩溃

我正在使用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)

python macos libdispatch python-3.x pynetdicom

1
推荐指数
1
解决办法
767
查看次数