這部分 GCC 并沒有提供實現(xiàn),也就是說GCC沒有義務提供這個實現(xiàn),我們只能用一些第三方的實現(xiàn)。
看不懂這一次GCC什么用意,都四年過去了。
所以現(xiàn)在在寫跨平臺多線程的程序時我一般選擇使用 Qt 這個框架(C++)。
當然,C語言發(fā)展了這么多年了,自然少不了自己的第三方庫,實際上標準庫只提供了很小的一部分內(nèi)容,甚至連某些常用的數(shù)據(jù)結構都未曾實現(xiàn),我們該一直反復造輪子嗎?
當然不!
在這個C的變成世界里,有許多實用的庫,其中最有名的且最通用(跨多個平臺的實現(xiàn)包括Windows,要知道很多實用的編程庫都不提供Windows的實現(xiàn))就是GLib這個庫,其中就有實現(xiàn)線程的部分。
但是,因為這是中文的,看的人自然不是歪果仁,中國編程新手大都還是習慣用 Windows 環(huán)境,也不做強求,仁者見仁智者見智,后續(xù)會有一個程序作為例子,其中簡單的應用了多線程的知識來寫一個備份軟件,線程的實現(xiàn)是用的 Windows 自己的接口,所有這些接口都能在 MSDN 里查找到相應文檔。
之所以不說 *nix 系統(tǒng)下的配置是因為,哪里的配置太無腦了,特別是Ubuntu,一句命令+有網(wǎng)絡基本就配置完畢了。
如果資源太少,可以參考如何編譯GTK項目的方法,因為GLib的前身便是GTK的一部分,只不過后來獨立出來了。
微軟的宇宙級編譯器Visual Studio對于C89(C90)之后的標準并不支持,但是對其中的特性卻早早進行了實現(xiàn)(即沒有可開啟標準的選項,但是新標準所說的特性它都擁有,都能夠使用,甚至還要更加超前)
glib\glib2.28\include目錄,不放心的還可以再添加一個glib\glib2.28\lib\glib-2.0\include目錄 glib\glib2.28\lib目錄glib\glib2.28\lib目錄下的所有.lib文件,即將這些文件的名字都手動輸入進去,如果使用我的這個版本的話那就是gio-2.0.lib glib-2.0.lib gthread-2.0.lib gmodule-2.0.lib gobject-2.0.lib多線程/MT是很多人(比如知乎的回答人和提問者),都提到要多觀看C的源代碼, 但是這對于初學者,甚至現(xiàn)在的我感覺也不是一件容易的事,更遑論初入門的同學了,特別是對于許多上個世紀的大神,為了節(jié)省空間以及提高效率,簡直是無所不用其極!雖然某些用法能夠被現(xiàn)代接受,但是你能在第一眼就看出來,為了構造一個紅黑樹節(jié)點,把樹的指針和節(jié)點的顏色信息都隱藏在一個指針地址里嗎?
/* 假設有一個節(jié)點的指針 p_node */
node_color = p_node->node_color & 1; /* 原理就是用最后一位bit來存儲顏色 */
其中在 Linux 里, p_node->node_color 被設定為無符號的長整形,以整數(shù)型式存儲指針和顏色信息,而不是用指針類型。
node_pointer = (node_type*)p_node->node_color & ~3;/* 清除最后兩位上的bit的值 */
也就是清除顏色信息,留下的就是指針的值,即地址。
為什么呢,只要我么能夠保證節(jié)點的創(chuàng)建位置是32位/64位對齊的,我們就能夠保證它的最后兩位/三位是空的,絕對不會被使用的。
/* 32位 */
sizeof(void*); /* 是 4 */
/* xxxx xxxx xxxx xxxx xxxx xxxx xxxx xx00 */
/* 64位 */
sizeof(void*); /* 是 8 */
/* 前方省略48位 xxxx xxxx xxxx x000 */
意思就是,對于指針而言,因為編譯器要保證尋址的高效所以它在給分配地址的時候,會對齊內(nèi)存中的地址,按照指針大小的倍數(shù)對齊,這就會導致不同位的程序的指針變量的值中有幾個bit 會沒有使用,則用它來存儲。
是
接下來的第三部分我會用一個備份程序來貫穿
Win32 APIVisual Studio 2013Pure C Programing Language會在里面介紹一下,常在開源代碼中看見的一些奇怪的東西,例如
#ifdef __cplusplus
extern "c" {
#endif
...
#ifdef __cplusplus
}
#endif
這到底是什么