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