在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ C/ 0x0A-C線程和Glib的視角
0x0E-單線程備份(下)
0x11-套接字編程-1
0x05-C語(yǔ)言指針:(Volume-1)
0x13-套接字編程-HTTP服務(wù)器(1)
0x0C-開(kāi)始行動(dòng)
C 語(yǔ)言進(jìn)階
第一部分
0x05-C語(yǔ)言指針(Volume-2)
0x08-C語(yǔ)言效率(下)
0x07-C語(yǔ)言效率(上)
0x04 C代碼規(guī)范
0x0F-多線程備份
0x05-C語(yǔ)言變量
第四部分
0x16-套接字編程-HTTP服務(wù)器(4)
0x0D-單線程備份(上)
總結(jié)
0x01-C語(yǔ)言序言
0x15-套接字編程-HTTP服務(wù)器(3)
0x14-套接字編程-HTTP服務(wù)器(2)
0x17-套接字編程-HTTP服務(wù)器(5)
第三部分
我的C語(yǔ)言
0x06-C語(yǔ)言預(yù)處理器
0x09-未曾領(lǐng)略的新風(fēng)景
0x0A-C線程和Glib的視角
第二部分
0x10-網(wǎng)絡(luò)的世界
0x12-套接字編程-2
0x03-C代碼
0x0B-C語(yǔ)言錯(cuò)誤處理

0x0A-C線程和Glib的視角

0x0A-C線程和Glib的視角

C11之線程

這部分 GCC 并沒(méi)有提供實(shí)現(xiàn),也就是說(shuō)GCC沒(méi)有義務(wù)提供這個(gè)實(shí)現(xiàn),我們只能用一些第三方的實(shí)現(xiàn)。

看不懂這一次GCC什么用意,都四年過(guò)去了。

所以現(xiàn)在在寫跨平臺(tái)多線程的程序時(shí)我一般選擇使用 Qt 這個(gè)框架(C++)。

當(dāng)然,C語(yǔ)言發(fā)展了這么多年了,自然少不了自己的第三方庫(kù),實(shí)際上標(biāo)準(zhǔn)庫(kù)只提供了很小的一部分內(nèi)容,甚至連某些常用的數(shù)據(jù)結(jié)構(gòu)都未曾實(shí)現(xiàn),我們?cè)撘恢狈磸?fù)造輪子嗎?

當(dāng)然不!

在這個(gè)C的變成世界里,有許多實(shí)用的庫(kù),其中最有名的且最通用(跨多個(gè)平臺(tái)的實(shí)現(xiàn)包括Windows,要知道很多實(shí)用的編程庫(kù)都不提供Windows的實(shí)現(xiàn))就是GLib這個(gè)庫(kù),其中就有實(shí)現(xiàn)線程的部分。

但是,因?yàn)檫@是中文的,看的人自然不是歪果仁,中國(guó)編程新手大都還是習(xí)慣用 Windows 環(huán)境,也不做強(qiáng)求,仁者見(jiàn)仁智者見(jiàn)智,后續(xù)會(huì)有一個(gè)程序作為例子,其中簡(jiǎn)單的應(yīng)用了多線程的知識(shí)來(lái)寫一個(gè)備份軟件,線程的實(shí)現(xiàn)是用的 Windows 自己的接口,所有這些接口都能在 MSDN 里查找到相應(yīng)文檔。

Glib庫(kù)在Windows下的配置

之所以不說(shuō) *nix 系統(tǒng)下的配置是因?yàn)?,哪里的配置太無(wú)腦了,特別是Ubuntu,一句命令+有網(wǎng)絡(luò)基本就配置完畢了。

  • 使用的是穩(wěn)定版的2.28.8版本,截至目前可用的最高穩(wěn)定版本為2.46.x版本
  • 將預(yù)處理配置好一些步驟的glib打包放在我的網(wǎng)盤中,可以直接下載,添加IDE的路徑就能使用,這是對(duì)于 Visual C++ 系列編譯器能用,如果用 MinGW 系列的編譯器就需要重新編譯
  • 如果想自己配置,也可以前往這個(gè)網(wǎng)址進(jìn)行下載,或者前往GNU項(xiàng)目主頁(yè)下載最新的源碼以及工程文件自我編譯,方式有很多,不使用現(xiàn)有二進(jìn)制而自行選擇編譯的大概莫過(guò)于想使用MinGW,在MinGW項(xiàng)目的主頁(yè)也有介紹
  • 如果資源太少,可以參考如何編譯GTK項(xiàng)目的方法,因?yàn)?strong>GLib的前身便是GTK的一部分,只不過(guò)后來(lái)獨(dú)立出來(lái)了。

  • 微軟的宇宙級(jí)編譯器Visual Studio對(duì)于C89(C90)之后的標(biāo)準(zhǔn)并不支持,但是對(duì)其中的特性卻早早進(jìn)行了實(shí)現(xiàn)(即沒(méi)有可開(kāi)啟標(biāo)準(zhǔn)的選項(xiàng),但是新標(biāo)準(zhǔn)所說(shuō)的特性它都擁有,都能夠使用,甚至還要更加超前)

  • 故接下來(lái)的備份程序?qū)⑹褂?strong>Visual Studio 2013 進(jìn)行編寫。
  1. 配置glib-2.28.8
  2. 下載編譯好的二進(jìn)制包,預(yù)處理好(某些操作,不多說(shuō),網(wǎng)上有教程,記得用谷歌,或者到博客園里找類似的,但是版本比較老可能和我用的有一些出路,但可以依著葫蘆畫瓢)以后,將路徑配置到工程里:
    1. 創(chuàng)建一個(gè)Win32程序,并且在屬性管理器(左側(cè)欄下部尋找)中創(chuàng)建屬性表(Debug和Release各創(chuàng)建一個(gè),設(shè)置都相同即可)
    2. 打開(kāi)新建的屬性表
    3. 通用屬性->VC++目錄->包含目錄->編輯 添加下載下來(lái)的文件中的glib\glib2.28\include目錄,不放心的還可以再添加一個(gè)glib\glib2.28\lib\glib-2.0\include目錄
    4. 通用屬性->VC++目錄->庫(kù)目錄->編輯 添加glib\glib2.28\lib目錄
    5. 通用屬性->鏈接器->輸入->附加依賴項(xiàng) 添加glib\glib2.28\lib目錄下的所有.lib文件,即將這些文件的名字都手動(dòng)輸入進(jìn)去,如果使用我的這個(gè)版本的話那就是
    6. gio-2.0.lib glib-2.0.lib gthread-2.0.lib gmodule-2.0.lib gobject-2.0.lib
    7. 通用屬性->C/C++->代碼生成->運(yùn)行庫(kù)開(kāi)啟多線程/MT
    8. Okay!成了

休息一下

  • 其實(shí)對(duì)于C程序員而言,最重要的莫過(guò)于使用一系列開(kāi)源庫(kù),而不是對(duì)新標(biāo)準(zhǔn)的追求,因?yàn)樵降偷臉?biāo)準(zhǔn)越容易跨平臺(tái),對(duì)于庫(kù)而言這是先輩總結(jié)的一系列實(shí)用的數(shù)據(jù)結(jié)構(gòu)和算法,甚至是實(shí)用的框架。我們不一定需要配置他們,而是從里面吸取一些他們的技術(shù),轉(zhuǎn)為自己的代碼,畢竟庫(kù)對(duì)于很多程序員編寫的程序來(lái)說(shuō)都大材小用了,但有時(shí)候又不得不使用一些必要的數(shù)據(jù)結(jié)構(gòu)和算法。
  • 在大學(xué)的這幾年里,也許是因?yàn)椴贿^(guò)是一個(gè)吊車尾的一本,所以我無(wú)法感受到老師教授帶來(lái)的教導(dǎo),但是也使得我深深的接觸到了開(kāi)源,開(kāi)源給予了我很多,比如更開(kāi)闊的編程思路,更廣闊的心胸,更有進(jìn)步的動(dòng)力,更多的小伙伴。當(dāng)然也知道自己的渺小。
  • 是很多人(比如知乎的回答人和提問(wèn)者),都提到要多觀看C的源代碼, 但是這對(duì)于初學(xué)者,甚至現(xiàn)在的我感覺(jué)也不是一件容易的事,更遑論初入門的同學(xué)了,特別是對(duì)于許多上個(gè)世紀(jì)的大神,為了節(jié)省空間以及提高效率,簡(jiǎn)直是無(wú)所不用其極!雖然某些用法能夠被現(xiàn)代接受,但是你能在第一眼就看出來(lái),為了構(gòu)造一個(gè)紅黑樹(shù)節(jié)點(diǎn),把樹(shù)的指針和節(jié)點(diǎn)的顏色信息都隱藏在一個(gè)指針地址里嗎?

      /* 假設(shè)有一個(gè)節(jié)點(diǎn)的指針 p_node */
      node_color = p_node->node_color & 1; /* 原理就是用最后一位bit來(lái)存儲(chǔ)顏色 */

    其中在 Linux 里, p_node->node_color 被設(shè)定為無(wú)符號(hào)的長(zhǎng)整形,以整數(shù)型式存儲(chǔ)指針和顏色信息,而不是用指針類型。

      node_pointer = (node_type*)p_node->node_color & ~3;/* 清除最后兩位上的bit的值 */

    也就是清除顏色信息,留下的就是指針的值,即地址。

    為什么呢,只要我么能夠保證節(jié)點(diǎn)的創(chuàng)建位置是32位/64位對(duì)齊的,我們就能夠保證它的最后兩位/三位是空的,絕對(duì)不會(huì)被使用的。

      /* 32位 */
      sizeof(void*); /* 是 4 */
      /* xxxx xxxx xxxx xxxx xxxx xxxx xxxx xx00 */
      /* 64位 */
      sizeof(void*); /* 是 8 */
      /* 前方省略48位 xxxx xxxx xxxx x000 */

    意思就是,對(duì)于指針而言,因?yàn)榫幾g器要保證尋址的高效所以它在給分配地址的時(shí)候,會(huì)對(duì)齊內(nèi)存中的地址,按照指針大小的倍數(shù)對(duì)齊,這就會(huì)導(dǎo)致不同位的程序的指針變量的值中有幾個(gè)bit 會(huì)沒(méi)有使用,則用它來(lái)存儲(chǔ)。

  • 具體的情況,網(wǎng)路上的詳細(xì)解說(shuō)十分之多,開(kāi)一個(gè)頭就好。但是這真的是我們一開(kāi)始就應(yīng)該接觸的嗎?

  • 怎么說(shuō),在很多的時(shí)候,C語(yǔ)言給我們的函數(shù)都不夠安全可靠,但是在我們無(wú)法使用新標(biāo)準(zhǔn)提供的函數(shù)的情況下(十分常見(jiàn))我們?cè)撊绾巫瞿兀?strong>當(dāng)然是自己寫,怎么寫更完美,自然是看看別人怎么寫,而不是自己一抹黑的亂來(lái),因?yàn)槭聦?shí)證明,自認(rèn)為好的到最后都會(huì)摔一跤,雖然不是壞事。
  • 最簡(jiǎn)單的做法便是用宏包裹一下,做一些預(yù)處理,或者對(duì)于宏機(jī)制不太喜歡的人會(huì)選擇用一個(gè)函數(shù)進(jìn)行包裹,也未嘗不可。

  • 寫在最末尾,填幾個(gè)前面挖的坑。
  • 不知道是不是故意的,一般GNU項(xiàng)目的子主頁(yè)面上,找不到(很難找到)對(duì)應(yīng)的項(xiàng)目的下載地址,也就是光看著介紹如何如何牛,如何如何好用,但就是不告訴你去哪里下,這時(shí)候,首先確認(rèn)你要下的這個(gè)軟件的名字,然后去GNU項(xiàng)目首頁(yè)里的程序列表里找,在哪里一定能找到,而不是在那些介紹頁(yè)面亂點(diǎn),結(jié)果根本找不到。
  • 最典型的就是一個(gè)叫做GMP的開(kāi)源軟件,用來(lái)自行編譯MinGW用的依賴,希望能警醒各位。
  • 之所以用2.28.8而不是2.46.x是因?yàn)槲覍?shí)在不想自己在Windows上編譯了,因?yàn)榇蟛糠謺r(shí)候,寫程序都是在 Linux 上,所以就偷懶一下。
  • 對(duì)于我的文件是不是有毒,我說(shuō)有毒,有一種叫做叫你再用Windows編程的毒。
  • 好吧其實(shí)我承認(rèn)Visual Studio的確是宇宙無(wú)敵的編譯器。

末尾

  • 接下來(lái)的第三部分我會(huì)用一個(gè)備份程序來(lái)貫穿

    • 操作系統(tǒng) : Windows
    • 跨平臺(tái) : 否
    • API調(diào)用 : Win32 API
    • 編譯器 : Visual Studio 2013
    • 語(yǔ)言 : Pure C Programing Language
  • 會(huì)在里面介紹一下,常在開(kāi)源代碼中看見(jiàn)的一些奇怪的東西,例如

      #ifdef __cplusplus
      extern "c" {
      #endif
      ...
      #ifdef __cplusplus
      }
      #endif

    這到底是什么