先看代码
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); NSMutableArray *array = [[NSMutableArray alloc]init]; for (int i = 0; i != 10000; ++i) { dispatch_async(queue, ^{ [array addObject:[NSNumber numberWithInt:i]]; }); }
这段代码90%会崩溃,原因是多线程导致内存错误。
看下面的代码
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); NSMutableArray *array = [[NSMutableArray alloc]init]; dispatch_semaphore_t semaphore = dispatch_semaphore_create(1);//信号量为1 for (int i = 0; i != 10000; ++i) { dispatch_async(queue, ^{ dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);//等待返回值为1或者大于1,获得执行权利后信号量-1 [array addObject:[NSNumber numberWithInt:i]]; dispatch_semaphore_signal(semaphore);//信号量+1 }); }
百分之百不崩溃,semaphore的值表示由多少线程可以操作,根据我们的设置,永远只有一个线程可以操作数组。
相关推荐
Swift中的`DispatchSemaphore`是GCD(Grand Central Dispatch)的一部分,它是Apple的多线程和并发解决方案。在iOS开发中,理解并熟练使用`DispatchSemaphore`对于优化代码性能和处理同步问题至关重要。本文将深入...
在iOS和macOS开发中,`OC-dispatch_semaphore` 是GCD(Grand Central Dispatch)的一部分,用于线程同步和通信。GCD是Apple提供的一种多线程解决方案,它简化了并发编程,允许开发者以更高级别的抽象来处理线程。`...
其中,`dispatch_semaphore`(信号量)是GCD的一个重要特性,用于控制对共享资源的访问,避免线程间的竞态条件。信号量在多线程编程中扮演着协调和同步的角色,类似于锁,但它提供了更灵活的控制方式。 1. **信号量...
GCD,全称为Grand Central Dispatch,是Apple在Mac OS X 10.6 Snow Leopard以及后续版本中引入的一种多核并行处理技术。它是Cocoa框架的一部分,为开发者提供了高效利用多核处理器的能力,简化了并发编程。在iOS和...
4. **等待(Wait)**:GCD提供`dispatch_semaphore`来实现线程间的同步等待。信号量可以看作是一种资源计数器,当资源数量为0时,其他线程会等待,直到资源数量增加。这种方式可以防止数据竞争,确保线程安全。 5. ...
在iOS和macOS开发中,Grand Central Dispatch(GCD)是一种强大的多线程技术,用于管理应用程序的并发性。GCD是Apple的C语言库,它抽象了底层的线程和处理器细节,使得开发者可以更方便地利用多核处理器的优势。本...
其中,`dispatch_semaphore` 是 GCD 提供的一种信号量机制,用于线程同步和资源管理。本文将深入探讨 `dispatch_semaphore` 的核心概念、常见函数及其在实际开发中的应用。 一、`dispatch_semaphore` 基本概念 `...
6. **DispatchQueue**: 虽然标题中提到的"dispatch"在Java标准库中并没有直接对应的概念,但在苹果的Java开发环境(JVM for macOS/iOS)中,有`com.apple.concurrent.DispatchQueue`类,它与GCD(Grand Central ...
`DispatchSemaphore`可以用来限制同时访问某资源的线程数量。 9. **GCD的Task优先级** 全局并行队列有四个优先级:`high`, `default`, `low`, 和 `background`,可以根据任务重要性选择。 10. **GCD与...
let semaphore = DispatchSemaphore(value: 1) ``` 然后在需要同步的地方使用wait和signal: ```swift semaphore.wait() // 等待信号量 // 访问共享资源 semaphore.signal() // 释放信号量 ``` 通过合理地使用GCD...
GCD(Grand Central Dispatch)是Apple在OS X和iOS系统中引入的一种多线程处理技术,旨在简化并发编程,提高应用程序的性能和响应速度。GCD利用了操作系统底层的调度机制,允许开发者以一种声明式的方式处理并发任务...
//信号量用途1://两个资源,三个线程执行;设定信号量值为2,先执行两个线程,等执行完一个,才会继续执行下一个,保证同一时间执行的线程不超过两个,保证线程的最大并发数 //信号量用途2://创建信号量的时候当锁...
5. **自旋锁**:在某些场景下,如果知道锁很快会被释放,可以使用自旋锁(`OS_dispatch_semaphore`)。自旋锁会让线程持续检查锁的状态,直到获得锁为止,但长时间的自旋会消耗CPU资源。 6. **GCD定时器**:GCD提供...
此外,还可以使用`os_dispatch_semaphore`信号量来控制资源访问,防止过多线程同时访问。 SwiftClass.xcworkspace项目中可能包含了多个Swift类,这些类可能会涉及到GCD的实践应用,如网络请求、数据解析、界面更新...
使用 `DispatchSemaphore` 来替换 POSIX semaphore,以简化同步代码。 #### 5.7 替换Run-Loop代码 通过使用 GCD 的 `DispatchSource` 来替换基于 Run-Loop 的代码,可以实现更高效的时间管理。 #### 5.8 与POSIX...
2. 信号量:控制并发访问资源,使用`dispatch_semaphore_create()`创建。 3. 任务优先级:GCD支持设置任务优先级,如`DISPATCH_QUEUE_PRIORITY_DEFAULT`、`DISPATCH_QUEUE_PRIORITY_HIGH`等。 4. 延迟执行:使用`...
在实践过程中,你还需要了解GCD的其他特性,如定时器(DispatchSourceTimer)、信号量(DispatchSemaphore)以及如何在不同平台(如macOS、iOS等)上使用GCD。 总之,通过GCD,你可以高效地管理并发任务,提高应用...
同时,GCD的信号量(semaphore)机制能进一步控制并发行为,确保资源的同步访问。 总的来说,GCD为iOS和Mac开发者提供了高效、易用的多线程解决方案。通过合理利用GCD的各种特性,可以优化应用程序性能,提高用户...
在Objective-C或Swift中,我们可以创建一个dispatch_semaphore_t类型的信号量,并通过dispatch_semaphore_create函数初始化。当线程需要访问共享资源时,它会调用dispatch_semaphore_wait,这将使线程等待,直到信号...