linux下線程常用的幾個函數整理

1 獲取線程ID

linux下獲取線程ID有兩種方法:

1)pid_t pid_id = gettid();

2)調用pthread_self()

gettid 獲取的是內核中線程ID,而pthread_self 是posix描述的線程ID。

gettid 獲取的是內核中真實線程ID,  對於多線程進程來說,每個tid實際是不一樣的。

而pthread_self獲取的是相對於進程的線程控制塊的首地址, 只是用來描述統一進程中的不同線程

2、設置線程屬性

這裏只解釋pthread_attr_t的其中幾種屬性

1)detach屬性:如果設置爲PTHREAD_CREATE_DETACHED 則新線程不能用pthread_join()來同步,且在退出時自行釋放所佔用的資源。缺省爲PTHREAD_CREATE_JOINABLE狀態。

即設置了detach屬性後,就不要添加pthread_join(tid, NULL);這個了。(這相當於是兩種方法,都可以使用)

2)policy屬性:表示新線程的調度策略,主要包括SCHED_OTHER(正常、非實時)、SCHED_RR(實時、輪轉法)和SCHED_FIFO(實時、先入先出)三種,缺省爲SCHED_OTHER,後兩種調度策略僅對超級用戶有效。運行時可以用過pthread_attr_setschedpolicy ()來改變。
SCHED_OTHER 分時調度策略;
SCHED_FIFO實時調度策略,先到先服務
SCHED_RR實時調度策略,時間片輪轉 
實時進程將得到優先調用,實時進程根據實時優先級決定調度權值,分時進程則通過nice和counter值決定權值,nice越小,counter越大,被調度的概率越大,也就是曾經使用了cpu最少的進程將會得到優先調度。
SHCED_RR和SCHED_FIFO的不同:

當採用SHCED_RR策略的進程的時間片用完,系統將重新分配時間片,並置於就緒隊列尾。放在隊列尾保證了所有具有相同優先級的RR任務的調度公平。    

SCHED_FIFO一旦佔用cpu則一直運行。一直運行直到有更高優先級任務到達或自己放棄。

如果有相同優先級的實時進程(根據優先級計算的調度權值是一樣的)已經準備好,FIFO時必須等待該進程主動放棄後纔可以運行這個優先級相同的任務。而RR可以讓每個任務都執行一段時間。

3)優先級屬性:爲struct sched_param結構,目前僅有一個sched_priority整型變量表示線程的優先級。這個參數僅當調度策略爲實時(即SCHED_RR或SCHED_FIFO)時纔有效,通過pthread_setschedparam()函數來改變,缺省爲0。

pthread_attr_t pthread_attr;
pthread_attr_init(&pthread_attr);
pthread_attr_setschedpolicy(&pthread_attr, SCHED_FIFO);
pthread_attr_setdetachstate(&pthread_attr, PTHREAD_CREATE_JOINABLE);//這個可以不用設置,因爲默認就是這個
pthread_join(tid, NULL);

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章