這篇文章,按照下面這 2 張圖,來(lái)描述 glib 在 Linux 和 Windows 平臺(tái)上,是如何來(lái)進(jìn)行線程庫(kù)的設(shè)計(jì)的。Linux 平臺(tái):Windows 平臺(tái):最近寫了幾篇關(guān)于跨平臺(tái)的應(yīng)用程序設(shè)計(jì)思路,有些小伙伴在后臺(tái)留言詢問(wèn)關(guān)于一些通用的跨平臺(tái)庫(kù),看來(lái)這方面的需求還是很多的。所謂的跨平臺(tái),無(wú)非就是希望用同一份應(yīng)用程序的代碼,可以編譯出在多個(gè)平臺(tái)上運(yùn)行的可執(zhí)行程序。那么如何才能做到應(yīng)用程序代碼的平臺(tái)無(wú)關(guān)呢?很明顯需要中間的一個(gè)橋接層,把自己不想處理的、那些與平臺(tái)相關(guān)的、煩人的代碼丟給這個(gè)中間層去處理。簡(jiǎn)單的說(shuō):就是那些需要處理與平臺(tái)相關(guān)的臟活、累活,都由這個(gè)中間層幫你做好了,我們?cè)趯?span>應(yīng)用程序時(shí),只需要關(guān)心自己的業(yè)務(wù)層事務(wù)就可以了。如果沒(méi)有這個(gè)中間層的話,你的代碼中可能會(huì)充斥著大量的#if...#else代碼。而 glib 就是這樣的一個(gè)中間層跨平臺(tái)庫(kù),它提供了很多常用的封裝,線程庫(kù)只是其中的封裝之一,這篇文章我們主要來(lái)學(xué)習(xí)一下 glib 是如何來(lái)設(shè)計(jì)跨平臺(tái)的線程庫(kù)。
二、glib 簡(jiǎn)介
第一眼看上去的時(shí)候,很容易把 glib 與 glibc 混淆,它倆都是基于 GPL 的開(kāi)源軟件,但是卻屬于完全不同的概念。glibc是GNU實(shí)現(xiàn)的一套標(biāo)準(zhǔn)C的函數(shù)庫(kù),而glib是gtk 的一套函數(shù)庫(kù)。那么 gtk 是什么呢?使用 Linux 的小伙伴一定知道 gnome 這個(gè)桌面環(huán)境,gnome 就是基于 gtk 開(kāi)發(fā)的一套桌面系統(tǒng),而 glib 就是位于 gtk 后面的那位無(wú)名英雄。glib可以在多個(gè)平臺(tái)下使用,比如Linux、Unix、Windows等。glib為許多標(biāo)準(zhǔn)的、常用的 C 語(yǔ)言結(jié)構(gòu)提供了相應(yīng)的替代物。作為一名 C 語(yǔ)言開(kāi)發(fā)者,有時(shí)候我們會(huì)非常的羨慕 C 開(kāi)發(fā)者,標(biāo)準(zhǔn)庫(kù)(SDL)有辣么多的工具可用:鏈表、向量、字符串處理。。。可是 C 語(yǔ)言里呢?哪哪都要自己去實(shí)現(xiàn)這些輪子。不過(guò)反過(guò)來(lái)說(shuō),如果我們?cè)谌粘5拈_(kāi)發(fā)過(guò)程中,把自己編寫的、從別處借鑒的那些好用的輪子都積累起來(lái),形成自己的“寶庫(kù)”,這也是一種經(jīng)驗(yàn)的體現(xiàn)、也是一種競(jìng)爭(zhēng)力。如今,在 github 上也有很多雷鋒實(shí)現(xiàn)了高質(zhì)量的 C 庫(kù):有專注于跨平臺(tái)的、有專注于某個(gè)領(lǐng)域的(比如:網(wǎng)絡(luò)處理、格式化文本解析)。glib 在解決跨平臺(tái)的同時(shí),也提供了其他很多有用的工具箱,例如:事件循環(huán)、線程池、同步隊(duì)列、內(nèi)存管理等等。既然它提供的功能多,那么必然會(huì)導(dǎo)致體積比較大。這也是很多開(kāi)發(fā)者面對(duì)不同的選擇時(shí),放棄 glib 的原因。不管如何,既然 glib 這么厲害,我們可以來(lái)學(xué)習(xí)它的設(shè)計(jì)思想,這可是比盲目的敲幾千行代碼更能提升一個(gè)人的元技能!
三、線程庫(kù)的設(shè)計(jì)
1. 線程相關(guān)的文件
在 Linux 系統(tǒng)中,創(chuàng)建線程一般都是通過(guò) POSIX 接口(可移植操作系統(tǒng)接口),例如:創(chuàng)建線程 API 函數(shù)是 pthread_create(...)。在 Windows 系統(tǒng)中,創(chuàng)建線程有好幾種方式: