Linux應用 執行緒學習

2021-08-15 00:27:20 字數 4185 閱讀 5382

執行緒相關函式

pthread_mutex_t g_tmutex = pthread_mutex_initializer;

pthread_cond_t g_tconvar = pthread_cond_initializer;

pthread_t id_1,id_2;

pid_t pid;

// 注意不要產生死鎖

pthread_mutex_lock(&g_tmutex );

pthread_mutex_unlock(&g_tmutex );

pthread_cond_signal(&g_tconvar); // 傳送一訊號

pthread_cond_wait(&g_tconvar, &g_tmutex ); // 等待一訊號

pthread_cond_timedwait( &g_tconvar, &g_tmutex , const struct timespec *abstime)// 等待多長時間

ret=pthread_create(&id_1,null,(void *) thread_1,0);

pthread_join(id_1,null);

pid=getpid();

注意: 執行緒的編譯,需要包含庫 -lpthread

pthread_mutex_lock(&g_tmutex);

pthread_cond_signal(&g_tconvar); // 配合 lock unlock函式用

pthread_mutex_unlock(&g_tmutex);

pthread_mutex_lock(&g_tmutex);

pthread_cond_wait(&g_tconvar, &g_tmutex); // 配合 lock unlock函式用

pthread_mutex_unlock(&g_tmutex);

sem_t sem;

sem_init(&sem,0,0);// 第2個引數不為0 時,在程序間共享,0只為執行緒共享

sem_wait(&sem);

sem_trywait(&sem);

sem_post(&sem);

sem_getvalue(&sem);

sem_destroy(&sem);

// 類似於訊號量的0 1 為了防止競爭,條件變數的使用總是和乙個互斥鎖結合在一起

pthread_mutex_t g_tautoplaythreadmutex = pthread_mutex_initializer;

pthread_cond_t g_tnetdbgsendconvar = pthread_cond_initializer;

pthread_mutex_lock(&g_tnetdbgsendmutex);

pthread_mutex_unlock(&g_tnetdbgsendmutex);

pthread_cond_wait(&g_tnetdbgsendconvar, &g_tnetdbgsendmutex);

pthread_cond_signal(&g_tnetdbgsendconvar);

int pthread_cond_timedwait(pthread_cond_t *cond, pthread_mutex_t *mutex, const struct timespec *abstime)

執行緒屬性及排程

int pthread_attr_init (pthread_attr_t *attr)

attr:執行緒屬性

返回值:成功0,錯誤-1。

設定繫結屬性: //與核心的執行緒固定繫結,不設定則有使用者空間分配

pthread_attr_setscope(pthread_attr_t *attr, init scope)

attr:執行緒屬性

scope:pthread_scope_system(繫結)

pthread_scope_prcess(非繫結)

返回值:成功0,錯誤-1。

設定分離屬性: 非分離屬性,需呼叫pthread_join()函式,來釋放自己

pthread_attr_setsetdetachstate(pthread_attr_t *attr, init detachstate)

attr:執行緒屬性

detachstate :pthread_creat_detached(分離)

pthread_creat_joinable(非分離)

返回值:成功0,錯誤-1。

獲取執行緒優先順序:

int pthread_attr_getschedparam (pthread_attr_attr *attr,

struct sched_param *param)

attr:執行緒屬性

param:執行緒優先順序

返回值:成功0,錯誤-1。

設定執行緒優先順序:

int pthread_attr_setschedparam (pthread_attr_attr *attr,

struct sched_param *param)

attr:執行緒屬性

param:執行緒優先順序

返回值:成功0,錯誤-1。

int pthread_attr_getschedparam (pthread_attr_attr *attr,

struct sched_param *param)

linux核心的三種排程策略:

1,sched_other 分時排程策略,

2,sched_fifo實時排程策略,先到先服務。一旦占用cpu則一直執行。一直執行直到有更高優先順序任務到達或自己放棄

3,sched_rr實時排程策略,時間片輪轉。當程序的時間片用完,系統將重新分配時間片,並置於就緒佇列尾。放在佇列尾保證了所有具有相同優先順序的rr任務的排程公平

linux執行緒優先順序設定

首先,可以通過以下兩個函式來獲得執行緒可以設定的最高和最低優先順序,函式中的策略即上述三種策略的巨集定義:

int sched_get_priority_max(int policy);

int sched_get_priority_min(int policy);

sched_other是不支援優先順序使用的,而sched_fifo和sched_rr支援優先順序的使用,他們分別為1和99,數值越大優先順序越高。

設定和獲取優先順序通過以下兩個函式:

int pthread_attr_setschedparam(pthread_attr_t *attr, const struct sched_param *param);

int pthread_attr_getschedparam(const pthread_attr_t *attr, struct sched_param *param);

例如以下**建立了乙個優先順序為10的執行緒:

struct sched_param

; 例:建立優先順序為10的執行緒

pthread_attr_t attr;

struct sched_param param;

pthread_attr_init(&attr);

pthread_attr_setschedpolicy(&attr, sched_rr);

param.sched_priority = 10;

pthread_attr_setschedparam(&attr, ¶m);

pthread_create(*** , &attr , *** , ***);

pthread_attr_destroy(&attr);

例: pthread_attr_t attr;

struct sched_param param;

int main(int argc,char **argv)

{ pthread_attr_ret=pthread_attr_init(&attr);

param.sched_priority=10;

pthread_ret=pthread_create(&uart1_pthread_t, &attr, (void *)uart1task, 0);

pthread_attr_ret=pthread_setschedparam(uart1_pthread_t,sched_fifo,¶m);

pthread_getschedparam(uart1_pthread_t, int *policy,¶m);

Linux 執行緒的應用

子執行緒與父執行緒的簡單使用 以及通過乙個結構體達到傳值的效果 include include include include include typedef struct exit t 返回值為乙個結構體 void ftn void arg if s 1 s 3 if s 3 printf i a...

linux 執行緒學習

一.執行緒建立 pthread create tid,null,fun,void arg 正常返回0.void fun void arg 二.執行緒終止 任意執行緒呼叫了exit,exit exit.那麼整個程序就會終止。單個執行緒退出 1.執行緒函式中 return或pthread exit,2....

Linux應用開發之執行緒

這一節我們來學習一下執行緒,首先來看一下執行緒建立函式 int pthread create pthread t thread,const pthread attr t attr,void start routine void void arg 第乙個引數thread 這個引數儲存的是建立了的執行緒...