C11

  • C11新增多執行緒支援庫-threads.h參考手冊

    ·

    執行緒管理 int thrd_create(thrd_t *thr, thrd_start_t func, void *arg); thrd_create建立一個新執行緒,該執行緒的工作就是執行func(arg)呼叫,程式設計師需要為執行緒編寫一個函式,函式簽名為:thrd_start_t ,即int (*)(void*)型別的函式。新建立的執行緒的識別符號存放在thr內。 thrd_t thrd_current(void); thrd_current函式返回撥用執行緒的識別符號。 int thrd_detach(thrd_t thr); thrd_detach會通知作業系統,當該執行緒結束時由作業系統負責回收該執行緒所佔用的資源。 int thrd_equal(thrd_t thr0, thrd_t thr1); thrd_equal用於判斷兩個執行緒識別符號是否相等(即標識同一執行緒),thrd_t是標準約定的型別,可能是一個基礎型別,也可能會是結構體,開發人員應該使用thrd_equal來判斷兩者是否相等,不能直接使用==。即便==在某個平臺下表現出來是正確的,但它不是標準的做法,也不可跨平臺。 void thrd_exit(int res) thrd_exit函式提早結束當前執行緒,res為它的退出狀態碼。這與程序中的exit函式類似。 int thrd_join(thrd_t thr, int *res) thrd_join將阻塞當前執行緒,直到執行緒thr結束時才返回。如果res非空,那麼res將儲存thr執行緒的結束狀態碼。如果某一執行緒內沒有呼叫thrd_detach函式將自己設定為detach狀態,那麼當它結束時必須由另外一個執行緒呼叫thrd_join函式將它留下的僵死狀態變為結束,並回收它所佔用的系統資源。 void thrd_sleep(const xtime *xt) thrd_sleep函式讓當前執行緒中途休眠,直到由xt指定的時間過去後才醒過來。 void thrd_yield(void) thrd_yield函式讓出CPU給其它執行緒或程序。 互斥物件和函式 threads.h中提供了豐富的互斥物件,使用者只需在mtx_init初始化時,指定該互斥物件的型別即可。 int mtx_int(mtx_t *mtx, int type); mtx_init函式用於初始化互斥物件,type決定互斥物件的型別,一共有下面6種型別: mtx_plain –簡單的,非遞迴互斥物件 mtx_timed –非遞迴的,支援超時的互斥物件 mtx_try…

    Read More

  • 使用C11新增的多執行緒支援庫-threads.h進行多執行緒程式設計

    ·

    2019年12月6日更新 首先要感謝評論區的熱心的同學們的提醒,經本人親自驗證: VS 2019中移除了對threads.h的支援(評論區有同學提到單獨安裝v140工具集可以實現支援,但是測試發現沒有效果),而GCC方面則在最新版中加入了對該標頭檔案的支援。 以下為原文(程式程式碼部分更新了Linux版Dome)。 導語 threads.h是C11標準新增的多執行緒支援庫,在此之前C語言實現多執行緒,除了使用系統API外用的最多的就是pthread.h了,threads.h在語法上和pthread.h非常相似。 當然,對於新出的C語言標準,各大編譯器廠商並不會馬上就支援。就比如說,Linux下主流的C語言編譯器————GCC,直到GCC7.2版本都沒能支援該庫(PS:看到老外網站上說要安裝最新版glibc才能獲得對該庫的支援,然而親測無卵用)。相反,VS在這方面做的就很不錯,VS2017已經可以完美支援該庫了,本文也將基於VS2017社羣版對該庫的使用方法做介紹。 注:本文僅對多執行緒程式設計的概念及threads.h庫檔案的使用方法做簡單介紹,並不會詳盡介紹該庫下的所有函式,如果你需要一個函式功能的參考手冊可以參考此篇文章:C11新增多執行緒支援庫-threads.h參考手冊 以一個小程式為例子 本程式中使用到的庫函式及宏: thrd_t //此宏定義用於存放執行緒識別符號的資料型別 thrd_create //此函式用於建立執行緒 thrd_detach //此函式用於通知作業系統,當執行緒結束時由作業系統負責釋放資源 thrd_exit //此函式用於結束當前執行緒 程式功能: 主執行緒每2秒列印一次“I love ibadboy.net~~~”,共列印10次。子執行緒每1秒列印一次“He love ibadboy.net!!!”,共列印10次。我們知道,在只有一個主執行緒的C程式中該功能是無法實現的,因為後一段程式程式碼必須等待前一段程式碼執行完畢才可執行。但,在多執行緒程式設計中,各個執行緒可以一起執行(這裡涉及到的同步、非同步等等的高階技術就不討論了)。舉個例子:在遊戲開發中,如果程式需要實時監控使用者鍵盤的輸入,就不能把這段程式碼放到主執行緒中,因為這樣的話該段程式碼就會被程式的其他部分阻塞掉而無法做到真正的“實時”,這時就可以利用多執行緒技術來化解尷尬啦!話不多說,直接上程式碼! 程式程式碼Linux版本 #include <stdio.h> #include <unistd.h> //包含sleep等函式 #include <stdbool.h> #include <threads.h> //包含多執行緒支援庫標頭檔案 #include <stdlib.h> //包含exit等函式 int thr_fun(void *); int main(void) { thrd_t thr; int ret; //儲存thrd_create函式的返回值用於判斷執行緒是否建立成功:0為成功,1為失敗。 ret = thrd_create(&thr, thr_fun, NULL);…

    Read More