多線程總結(jié)

pthread_mutex_lock和pthread_spin_lock的區(qū)別:

從 實(shí)現(xiàn)原理上來講恰聘,Mutex屬于sleep-waiting類型的鎖句各。例如在一個(gè)雙核的機(jī)器上有兩個(gè)線程(線程A和線程B),它們分別運(yùn)行在Core0和 Core1上晴叨。假設(shè)線程A想要通過pthread_mutex_lock操作去得到一個(gè)臨界區(qū)的鎖凿宾,而此時(shí)這個(gè)鎖正被線程B所持有,那么線程A就會(huì)被阻塞 (blocking)兼蕊,Core0 會(huì)在此時(shí)進(jìn)行上下文切換(Context Switch)將線程A置于等待隊(duì)列中初厚,此時(shí)Core0就可以運(yùn)行其他的任務(wù)(例如另一個(gè)線程C)而不必進(jìn)行忙等待。而Spin lock則不然遍略,它屬于busy-waiting類型的鎖惧所,如果線程A是使用pthread_spin_lock操作去請(qǐng)求鎖骤坐,那么線程A就會(huì)一直在 Core0上進(jìn)行忙等待并不停的進(jìn)行鎖請(qǐng)求绪杏,直到得到這個(gè)鎖為止。

所以纽绍,自旋鎖一般用用多核的服務(wù)器蕾久。


GCD中syn即同步,asyn即異步拌夏,可根據(jù)函數(shù)名理解其功能?

dispatch_semaphore是在線程間工作的工具僧著,作用

1. 保持線程同步(例:設(shè)置初始信號(hào)量為0)

2. 為線程加鎖 (例:設(shè)置初始信號(hào)量為1,dispatch_semaphore_wait ? ? 臨界區(qū) ?dispatch_semaphore_signal?)

先看下相關(guān)的3個(gè)方法:

dispatch_semaphore_t dispatch_semaphore_create(long value):方法接收一個(gè)long類型的參數(shù), 返回一個(gè)dispatch_semaphore_t類型的信號(hào)量障簿,值為傳入的參數(shù)

long dispatch_semaphore_wait(dispatch_semaphore_t dsema, dispatch_time_t timeout):接收一個(gè)信號(hào)和時(shí)間值盹愚,若信號(hào)的信號(hào)量為0,則會(huì)阻塞當(dāng)前線程站故,直到信號(hào)量大于0或者經(jīng)過輸入的時(shí)間值后再繼續(xù)運(yùn)行皆怕;若信號(hào)量大于0,則會(huì)使信號(hào)量減1并返回西篓,程序繼續(xù)住下執(zhí)行愈腾,調(diào)度組中的dispatch_group_wait的作用差不多和其相似,不同點(diǎn)是dispatch_group_wait會(huì)等待group內(nèi)的任務(wù)執(zhí)行完畢

long dispatch_semaphore_signal(dispatch_semaphore_t dsema):使信號(hào)量加1并返回

dispatch_group

dispatch_group_async()

dispatch_group_sync()

dispatch_group_notify()

dispatch_group_wait()

dispatch_group_enter()

dispatch_group_leave()

Disptch_group_t跟單一派發(fā)的區(qū)別:

單一派發(fā)就是把某一任務(wù)(或block)放在某個(gè)隊(duì)列(queue)以某種方式(同步或異步)執(zhí)行

調(diào)度組是將多個(gè)這樣的過程以程序員的意愿去按某種方式統(tǒng)一規(guī)劃協(xié)調(diào)它們之間的執(zhí)行順序

dispatch_group_notify()和dispatch_group_wait()的區(qū)別岂津;

首先我們來介紹dispatch_group_async()函數(shù)的使用方式虱黄,該函數(shù)會(huì)將隊(duì)列與相應(yīng)的任務(wù)組進(jìn)行關(guān)聯(lián),并且自動(dòng)執(zhí)行吮成。當(dāng)與任務(wù)組關(guān)聯(lián)的隊(duì)列中的任務(wù)都執(zhí)行完畢后橱乱,會(huì)通過dispatch_group_notify()函數(shù)發(fā)出通知告訴用戶任務(wù)組中的所有任務(wù)都執(zhí)行完畢了辜梳。使用通知的方式是不會(huì)阻塞當(dāng)前線程的,如果你使用dispatch_group_wait()函數(shù)仅醇,那么就會(huì)阻塞當(dāng)前線程冗美,直到任務(wù)組中的所有任務(wù)都執(zhí)行完畢。我的理解:都是等待group中的任務(wù)執(zhí)行完畢析二,不同點(diǎn)是有無阻塞當(dāng)前線程粉洼,是同步和異步的區(qū)別

** dispatch_set_target_queue小結(jié):**

dispatch_set_target_queue可以更改Dispatch Queue優(yōu)先級(jí)。

dispatch_set_target_queue可以更改隊(duì)列的執(zhí)行層次叶摄,隊(duì)列里的任務(wù)將會(huì)按照目標(biāo)隊(duì)列(target Queue)的隊(duì)列來處理

鏈接:https://www.jianshu.com/p/2a614531187f

dispatch_apply()函數(shù)是用來循環(huán)來執(zhí)行隊(duì)列中的任務(wù)的属韧,使用方式為:dispatch_apply(循環(huán)次數(shù), 任務(wù)所在的隊(duì)列) { 要循環(huán)執(zhí)行的任務(wù) }。使用該函數(shù)循環(huán)執(zhí)行并行隊(duì)列中的任務(wù)時(shí)蛤吓,會(huì)開辟新的線程宵喂,不過有可能會(huì)在當(dāng)前線程中執(zhí)行一些任務(wù)。而使用dispatch_apply()執(zhí)行串行隊(duì)列中的任務(wù)時(shí)会傲,會(huì)在當(dāng)前線程中執(zhí)行锅棕。無論是使用并行隊(duì)列還是串行隊(duì)列,dispatch_apply()都會(huì)阻塞當(dāng)前執(zhí)行函數(shù)線程淌山。

另外裸燎,由于dispatch_apply函數(shù)也與dispatch_sync函數(shù)相同,會(huì)等待處理執(zhí)行結(jié)束泼疑,因此推薦在dispatch_async函數(shù)中非同步地執(zhí)行dispatch_apply函數(shù)德绿。即在其他線程中執(zhí)行




進(jìn)程,線程相關(guān)總結(jié):

一退渗、說說概念

1移稳、進(jìn)程(process

狹義定義:進(jìn)程就是一段程序的執(zhí)行過程。

廣義定義:進(jìn)程是一個(gè)具有一定獨(dú)立功能的程序關(guān)于某個(gè)數(shù)據(jù)集合的一次運(yùn)行活動(dòng)会油。它是操作系統(tǒng)動(dòng)態(tài)執(zhí)行的基本單元个粱,在傳統(tǒng)的操作系統(tǒng)中,進(jìn)程既是基本的分配單元翻翩,也是基本的執(zhí)行單元都许。

簡單的來講進(jìn)程的概念主要有兩點(diǎn)第一,進(jìn)程是一個(gè)實(shí)體体斩。每一個(gè)進(jìn)程都有它自己的地址空間梭稚,一般情況下,包括文本區(qū)域(text region)絮吵、數(shù)據(jù)區(qū)域(data region)和堆棧(stack region)弧烤。文本區(qū)域存儲(chǔ)處理器執(zhí)行的代碼;數(shù)據(jù)區(qū)域存儲(chǔ)變量和進(jìn)程執(zhí)行期間使用的動(dòng)態(tài)分配的內(nèi)存;堆棧區(qū)域存儲(chǔ)著活動(dòng)過程調(diào)用的指令和本地變量暇昂。第二莺戒,進(jìn)程是一個(gè)“執(zhí)行中的程序”。程序是一個(gè)沒有生命的實(shí)體急波,只有處理器賦予程序生命時(shí)从铲,它才能成為一個(gè)活動(dòng)的實(shí)體,我們稱其為進(jìn)程澄暮。

進(jìn)程狀態(tài):進(jìn)程有三個(gè)狀態(tài)名段,就緒、運(yùn)行和阻塞泣懊。就緒狀態(tài)其實(shí)就是獲取了出cpu外的所有資源伸辟,只要處理器分配資源就可以馬上執(zhí)行。就緒狀態(tài)有排隊(duì)序列什么的馍刮,排隊(duì)原則不再贅述信夫。運(yùn)行態(tài)就是獲得了處理器分配的資源,程序開始執(zhí)行。阻塞態(tài),當(dāng)程序條件不夠時(shí)候放椰,需要等待條件滿足時(shí)候才能執(zhí)行,如等待i/o操作時(shí)候振湾,此刻的狀態(tài)就叫阻塞態(tài)。

2梅誓、程序

說起進(jìn)程恰梢,就不得不說下程序佛南。先看定義:程序是指令和數(shù)據(jù)的有序集合梗掰,其本身沒有任何運(yùn)行的含義,是一個(gè)靜態(tài)的概念嗅回。而進(jìn)程則是在處理機(jī)上的一次執(zhí)行過程及穗,它是一個(gè)動(dòng)態(tài)的概念。這個(gè)不難理解绵载,其實(shí)進(jìn)程是包含程序的埂陆,進(jìn)程的執(zhí)行離不開程序,進(jìn)程中的文本區(qū)域就是代碼區(qū)娃豹,也就是程序焚虱。

3、線程

通常在一個(gè)進(jìn)程中可以包含若干個(gè)線程懂版,當(dāng)然一個(gè)進(jìn)程中至少有一個(gè)線程鹃栽,不然沒有存在的意義。線程可以利用進(jìn)程所擁有的資源躯畴,在引入線程的操作系統(tǒng)中民鼓,通常都是把進(jìn)程作為分配資源的基本單位薇芝,而把線程作為獨(dú)立運(yùn)行和獨(dú)立調(diào)度的基本單位,由于線程比進(jìn)程更小丰嘉,基本上不擁有系統(tǒng)資源夯到,故對(duì)它的調(diào)度所付出的開銷就會(huì)小得多,能更高效的提高系統(tǒng)多個(gè)程序間并發(fā)執(zhí)行的程度饮亏。

4耍贾、多線程

在一個(gè)程序中,這些獨(dú)立運(yùn)行的程序片段叫作“線程”(Thread)路幸,利用它編程的概念就叫作“多線程處理”逼争。多線程是為了同步完成多項(xiàng)任務(wù),不是為了提高運(yùn)行效率劝赔,而是為了提高資源使用效率來提高系統(tǒng)的效率誓焦。線程是在同一時(shí)間需要完成多項(xiàng)任務(wù)的時(shí)候?qū)崿F(xiàn)的。

最簡單的比喻多線程就像火車的每一節(jié)車廂着帽,而進(jìn)程則是火車杂伟。車廂離開火車是無法跑動(dòng)的,同理火車也不可能只有一節(jié)車廂仍翰。多線程的出現(xiàn)就是為了提高效率赫粥。

二、說說區(qū)別

1予借、進(jìn)程與線程的區(qū)別:

進(jìn)程和線程的主要差別在于它們是不同的操作系統(tǒng)資源管理方式越平。進(jìn)程有獨(dú)立的地址空間,一個(gè)進(jìn)程崩潰后灵迫,在保護(hù)模式下不會(huì)對(duì)其它進(jìn)程產(chǎn)生影響秦叛,而線程只是一個(gè)進(jìn)程中的不同執(zhí)行路徑。線程有自己的堆棧和局部變量瀑粥,但線程之間沒有單獨(dú)的地址空間挣跋,一個(gè)線程死掉就等于整個(gè)進(jìn)程死掉所以多進(jìn)程的程序要比多線程的程序健壯狞换,但在進(jìn)程切換時(shí)避咆,耗費(fèi)資源較大,效率要差一些修噪。但對(duì)于一些要求同時(shí)進(jìn)行并且又要共享某些變量的并發(fā)操作查库,只能用線程,不能用進(jìn)程黄琼。

1) 簡而言之,一個(gè)程序至少有一個(gè)進(jìn)程,一個(gè)進(jìn)程至少有一個(gè)線程.

2) 線程的劃分尺度小于進(jìn)程樊销,使得多線程程序的并發(fā)性高。

3) 另外,進(jìn)程在執(zhí)行過程中擁有獨(dú)立的內(nèi)存單元现柠,而多個(gè)線程共享內(nèi)存院领,從而極大地提高了程序的運(yùn)行效率。

4) 線程在執(zhí)行過程中與進(jìn)程還是有區(qū)別的够吩。每個(gè)獨(dú)立的線程有一個(gè)程序運(yùn)行的入口比然、順序執(zhí)行序列和程序的出口。但是線程不能夠獨(dú)立執(zhí)行周循,必須依存在應(yīng)用程序中强法,由應(yīng)用程序提供多個(gè)線程執(zhí)行控制。

5) 從邏輯角度來看湾笛,多線程的意義在于一個(gè)應(yīng)用程序中饮怯,有多個(gè)執(zhí)行部分可以同時(shí)執(zhí)行。但操作系統(tǒng)并沒有將多個(gè)線程看做多個(gè)獨(dú)立的應(yīng)用嚎研,來實(shí)現(xiàn)進(jìn)程的調(diào)度和管理以及資源分配蓖墅。這就是進(jìn)程和線程的重要區(qū)別。

三临扮、說說優(yōu)缺點(diǎn)

線程和進(jìn)程在使用上各有優(yōu)缺點(diǎn):線程執(zhí)行開銷小论矾,但不利于資源的管理和保護(hù);而進(jìn)程正相反杆勇。同時(shí)贪壳,線程適合于在SMP(多核處理機(jī))機(jī)器上運(yùn)行,而進(jìn)程則可以跨機(jī)器遷移

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蚜退,一起剝皮案震驚了整個(gè)濱河市闰靴,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌钻注,老刑警劉巖蚂且,帶你破解...
    沈念sama閱讀 219,270評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異队寇,居然都是意外死亡膘掰,警方通過查閱死者的電腦和手機(jī)章姓,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門佳遣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人凡伊,你說我怎么就攤上這事零渐。” “怎么了系忙?”我有些...
    開封第一講書人閱讀 165,630評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵诵盼,是天一觀的道長。 經(jīng)常有香客問我,道長风宁,這世上最難降的妖魔是什么洁墙? 我笑而不...
    開封第一講書人閱讀 58,906評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮戒财,結(jié)果婚禮上热监,老公的妹妹穿的比我還像新娘。我一直安慰自己饮寞,他們只是感情好孝扛,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,928評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著幽崩,像睡著了一般苦始。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上慌申,一...
    開封第一講書人閱讀 51,718評(píng)論 1 305
  • 那天陌选,我揣著相機(jī)與錄音,去河邊找鬼蹄溉。 笑死柠贤,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的类缤。 我是一名探鬼主播臼勉,決...
    沈念sama閱讀 40,442評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼餐弱!你這毒婦竟也來了宴霸?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,345評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤膏蚓,失蹤者是張志新(化名)和其女友劉穎瓢谢,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體驮瞧,經(jīng)...
    沈念sama閱讀 45,802評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡氓扛,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,984評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了论笔。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片采郎。...
    茶點(diǎn)故事閱讀 40,117評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖狂魔,靈堂內(nèi)的尸體忽然破棺而出蒜埋,到底是詐尸還是另有隱情,我是刑警寧澤最楷,帶...
    沈念sama閱讀 35,810評(píng)論 5 346
  • 正文 年R本政府宣布整份,位于F島的核電站待错,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏烈评。R本人自食惡果不足惜火俄,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,462評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望讲冠。 院中可真熱鬧烛占,春花似錦、人聲如沸沟启。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽德迹。三九已至芽卿,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間胳搞,已是汗流浹背卸例。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評(píng)論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留肌毅,地道東北人筷转。 一個(gè)月前我還...
    沈念sama閱讀 48,377評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像悬而,于是被迫代替她去往敵國和親呜舒。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,060評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • iOS多線程編程 基本知識(shí) 1. 進(jìn)程(process) 進(jìn)程是指在系統(tǒng)中正在運(yùn)行的一個(gè)應(yīng)用程序笨奠,就是一段程序的執(zhí)...
    陵無山閱讀 6,055評(píng)論 1 14
  • 多線程有幾個(gè)重要的概念袭蝗,任務(wù)、隊(duì)列般婆、線程到腥。任務(wù):是指執(zhí)行什么樣的操作,在GCD中就是block蔚袍。隊(duì)列:用來存放任務(wù)...
    西南柯北閱讀 285評(píng)論 0 4
  • 本文轉(zhuǎn)載自:行走的少年郎的簡書:iOS多線程:『GCD』詳盡總結(jié) 本文用來介紹 iOS 多線程中 GCD 的相關(guān)知...
    遠(yuǎn)遊旳遊子閱讀 1,114評(píng)論 0 10
  • 剛晴了幾天的北京又迎來了一個(gè)大霧霾天乡范,這樣的天氣實(shí)在不適合復(fù)習(xí)《近代史》,雙重的壓抑啤咽,壓抑的像表演胸口碎大石失...
    娜姐de時(shí)光情簡閱讀 209評(píng)論 0 3
  • 2018.1.9 周二 晴 久違的太陽你今天總算是露臉啦晋辆。不過相對(duì)的溫度明顯要比昨天低好幾度...
    陳2468_TA76課程閱讀 155評(píng)論 0 0