iOS學習筆記1-死鎖deadlock理解

1.首先看一下官方文檔的解釋,這個block的隊列是同步執行的,不像異步,這個方法直到block執行完畢纔會返回異步

2.主線程一旦開啓,就要先把本身的代碼執行完成以後,纔去執行加入到主隊列中的任務async

Declaration

void dispatch_sync( dispatch_queue_t queue, dispatch_block_t block);this

Parameters

queue

The queue on which to submit the block. This parameter cannot be NULL.spa

block

The block to be invoked on the target dispatch queue. This parameter cannot be NULL.線程

Discussion

Submits a block to a dispatch queue for synchronous execution. Unlike dispatch_async, this function does not return until the block has finished. Calling this function and targeting the current queue results in deadlock.code

死鎖緣由:

a)       dispatch_sync這個方法要等到block的執行完以後,才返回orm

b)      主線程一旦開啓,就要先把本身的代碼執行完成以後,纔去執行加入到主隊列中的任務隊列

c)       這樣主線程想要執行block,先要下去執行下面的代碼,可是由於dispatch_sync這個方法,,若是返回不了,主線程就沒法向下再次執行,因此形成了死鎖,因此把主線程卡到這裏了,形成了死鎖ci

- (void)viewDidLoad {
    [super viewDidLoad];
    
    NSLog(@"1"); // 任務1    此時只會執行到任務一結束,就不會再繼續執行了
    dispatch_sync(dispatch_get_main_queue(), ^{
        NSLog(@"2--%@",[NSThread currentThread]); // 任務2
    });
    NSLog(@"3"); // 任務3
}
    NSLog(@"1"); // 任務1
    dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
        NSLog(@"2"); // 任務2
    });
    NSLog(@"3"); // 任務3  此時都會打印出來
相關文章
相關標籤/搜索