主線程做的事情 dispatch_queue_t mainQueue= dispatch_get_main_queue();
dispatch_sync(mainQueue, ^{
[self updateImageWithData:data andIndex:i];
}); 多線程串行隊(duì)列 /*創(chuàng)建一個(gè)串行隊(duì)列 第一個(gè)參數(shù):隊(duì)列名稱 第二個(gè)參數(shù):隊(duì)列類型 */ dispatch_queue_t serialQueue=dispatch_queue_create("myThreadQueue1", DISPATCH_QUEUE_SERIAL);//注意queue對(duì)象不是指針類型 //創(chuàng)建多個(gè)線程用于填充圖片 for (int i=0; i<count; ++i) { //異步執(zhí)行隊(duì)列任務(wù) dispatch_async(serialQueue, ^{ [self loadImage:[NSNumber numberWithInt:i]]; }); }//非ARC環(huán)境請(qǐng)釋放 dispatch_release(seriQueue); 并發(fā)隊(duì)列 dispatch_queue_t globalQueue=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); //創(chuàng)建多個(gè)線程用于填充圖片 for (int i=0; i<count; ++i) { //異步執(zhí)行隊(duì)列任務(wù) dispatch_async(globalQueue, ^{ [self loadImage:[NSNumber numberWithInt:i]]; }); } GCD執(zhí)行任務(wù)的方法并非只有簡(jiǎn)單的同步調(diào)用方法和異步調(diào)用方法,,還有其他一些常用方法:
解決線程對(duì)資源的搶占性問(wèn)題的原理 在GCD中提供了一種信號(hào)機(jī)制,,也可以解決資源搶占問(wèn)題(和同步鎖的機(jī)制并不一樣),。GCD中信號(hào)量是dispatch_semaphore_t類型,支持信號(hào)通知和信號(hào)等待,。每當(dāng)發(fā)送一個(gè)信號(hào)通知,,則信號(hào)量+1;每當(dāng)發(fā)送一個(gè)等待信號(hào)時(shí)信號(hào)量-1,,;如果信號(hào)量為0則信號(hào)會(huì)處于等待狀態(tài),,直到信號(hào)量大于0開(kāi)始執(zhí)行,。根據(jù)這個(gè)原理我們可以初始化一個(gè)信號(hào)量變量,默認(rèn)信號(hào)量設(shè)置為1,,每當(dāng)有線程進(jìn)入“加鎖代碼”之后就調(diào)用信號(hào)等待命令(此時(shí)信號(hào)量為0)開(kāi)始等待,,此時(shí)其他線程無(wú)法進(jìn)入,執(zhí)行完后發(fā)送信號(hào)通知(此時(shí)信號(hào)量為1),,其他線程開(kāi)始進(jìn)入執(zhí)行,,如此一來(lái)就達(dá)到了線程同步目的。 問(wèn)題原型:假設(shè)現(xiàn)在有9張圖片,,但是有15個(gè)線程都準(zhǔn)備加載這9張圖片,,約定不能重復(fù)加載同一張圖片,這樣就形成了一個(gè)資源搶奪的情況,。在下面的程序中將創(chuàng)建9張圖片,,每次讀取照片鏈接時(shí)首先判斷當(dāng)前鏈接數(shù)是否大于1,用完一個(gè)則立即移除,,最多只有9個(gè)解決線程對(duì)資源的搶占性問(wèn)題的解決方案 /*信號(hào)等待 第二個(gè)參數(shù):等待時(shí)間 */ dispatch_semaphore_wait(_semaphore, DISPATCH_TIME_FOREVER); if (_imageNames.count>0) { name=[_imageNames lastObject]; [_imageNames removeObject:name]; } //信號(hào)通知 dispatch_semaphore_signal(_semaphore); |
|