多线程 - 2
Grand Central DisPatch
dispatch queue
队列
dispatch_queue_t
创建
dispatch_queue_t
dispatch_queue_create(const char *label, dispatch_queue_attr_t attr);
使用
void
dispatch_async(dispatch_queue_t queue, dispatch_block_t block);
void
dispatch_sync(dispatch_queue_t queue, dispatch_block_t block);
main dispatch queue
有且只有一个main dispatch queue
所有任务都在主线程中执行
Serial Queue
一个队列,一个线程。可以精确控制任务执行的顺序。但是并发性差。
Concurrent Queue
一个队列,多个线程。
内置dispatch queue
dispatch_queue_t
dispatch_get_global_queue(long identifier, unsigned long flags);
dispatch_after
void
dispatch_after(dispatch_time_t when, dispatch_queue_t queue, dispatch_block_t block);
线程安全
使用serial queue 的特性保证资源的线程安全
相比lock unlock
更安全:避免不对称的锁的调用
性能更好:避免大量计算在后台进行
更清晰:线程模型更清楚
死锁
dispatch_async(_queue, ^{
dispatch_sync(_queue, ^{
//do someing
})
})
//main thread
dispatch_sync(_queue(),^{
//do someing
});
//queue task
dispatch_sync(dispatch_get_main_queue(),^{
//do someing
});
dispatch_once
在多线程中避免使用单例时产生两个对象。
屏幕快照 2017-07-18 上午12.22.26.png
屏幕快照 2017-07-18 上午12.25.25.png
dispatch_semaphore
控制dispatch_queue 并发数?
- 计并发数为concurrent_count
- concurent_count < 15
- 有任务进来,concurrent_count++
- 有任务完成,concurrent_count--
- 对concurrent_count加锁
创建信号量
dispatch_semaphore_t
dispatch_semaphore_create(long value)
触发信号量
long
dispatch_semaphore_signal(dispatch_semaphore_t dsema);
等待信号量
long
dispatch_semaphore_wait(dispatch_semaphore_t dsema, dispatch_time_t timeout);
dispatch_group
创建group
dispatch_group_t
dispatch_group_create(void);
给任务设置group
void
dispatch_group_async(dispatch_group_t group, dispatch_queue_t queue, dispatch_block_t block);
等待group完成
long
dispatch_group_wait(dispatch_group_t group, dispatch_time_t timeout);