linux高編執行緒 執行緒同步 互斥量

2022-07-19 06:39:13 字數 4338 閱讀 5518

執行緒同步

互斥量:某乙個資源可能在使用的過程中產生競爭和衝突。那麼互斥量解決同一時刻只有執行緒對資源進行操作。限制的是**。

/*

*********************

*功能:銷毀乙個互斥量

*引數:mutex:型別為pthread_mutex_t型別的變數

*返回值:成功返回0,失敗返回errno

* ******************

*/int pthread_mutex_destroy(pthread_mutex_t *mutex);

/********************

*功能:動態建立互斥量:如果 變數位於乙個結構體中,用動態初始化

*引數:mutex:互斥變數

* attr:屬性

* ****************

*/int pthread_mutex_init(pthread_mutex_t *restrict mutex,const pthread_mutexattr_t *restrict attr);

/******************

*靜態初始化

*互斥量如果是乙個變數的話可以用靜態初始化

* *************

*/pthread_mutex_t mutex =pthread_mutex_initializer;

/****lock-unlock:建立乙個臨界區***

*//*

***lock:是非阻塞,lock是阻塞****

*/int pthread_mutex_lock(pthread_mutex_t *mutex);

int pthread_mutex_trylock(pthread_mutex_t *mutex);

int pthread_mutex_unlock(pthread_mutex_t *mutex);

/*

****************

*功能:保證執行緒只被執行一次

*引數:once_control:變數

* init_routine:執行緒函式入口位址

***************

*/int pthread_once(pthread_once_t *once_control,void (*init_routine)(void

));pthread_once_t once_control = pthread_once_init;

下面兩個例子說明執行緒互斥的使用

/*

********

功能:建立20個執行緒,每個執行緒的任務就是從檔案中讀取資料,加1後,寫入檔案

使用到的相關知識:執行緒的建立銷毀以及執行緒的互斥(解決執行緒之間的程序問題)

********

*/#include

#include

#include

#define thrnum 20

#define fname "/tmp/out"

#define size 1024

//建立互斥量

static pthread_mutex_t mut =pthread_mutex_initializer;

//執行緒

static

void *thr_add(void *p)

//2.鎖住將要執行的**

pthread_mutex_lock(&mut);

fgets(buf,size,fp);

rewind(fp);

//sleep(1);

fprintf(fp,"

%d\n

",atoi(buf)+1

); fclose(fp);

//3.解鎖

pthread_mutex_unlock(&mut);

//4.執行緒退出

pthread_exit(null);

}int

main()

}//2.等待收屍

for(i = 0; i < thrnum ;i++)

pthread_join(tid[i],null);

//3.銷毀互斥量

pthread_mutex_destroy(&mut);

exit(0);

}

範例2:四個執行緒不斷向終端輸出abcd字元,用執行緒a解執行緒b的鎖,b解c的鎖依次類推

/*

******************

功能:4個執行緒分別向終端按照次序輸出abcd

使用的知識:執行緒互斥量

*******************

*/#include

#include

#include

#define thrnum 4

//四個執行緒的執行緒互斥量

static

pthread_mutex_t mut[thrnum];

/*函式功能:返回下乙個執行緒順序

*/static

int next(int

a)//

執行緒static

void *thr_func(void *p)

//3.執行緒退出

pthread_exit(null);

}int

main()

}//2.解鎖第乙個執行緒互斥量

pthread_mutex_unlock(mut+0

);

訊號打斷

alarm(5

);

//4.收屍

for(i = 0; i < thrnum ;i++)

exit(

0);

篩質數:

/*

*****************

*功能:多執行緒篩質數

*知識點:互斥鎖的使用

* *************

*/#include

#include

#include

#include

//質數範圍

#define left 30000000

#define right 30000200

//執行緒數量

#define thrnum 4

//num > 0 有任務

//num = 0 無任務

//num = -1 完成

static

int num = 0;//

互斥量static pthread_mutex_t mut_num =pthread_mutex_initializer ;

void *thr_primer(void *);

intmain()

}執行緒負責下發任務

//每次檢視num的值之前需要加鎖

for(i = left ; i <= right ; i++)

下發任務

num =i ;

解鎖pthread_mutex_unlock(&mut_num);

}//3.所有任務處理完畢:需要檢視num值是否為0,所以加鎖檢視

pthread_mutex_lock(&mut_num);

最後乙個任務發出去後,但是其他執行緒沒有處理完,main執行緒又搶到鎖

while(num != 0

)

//4.所有任務處理完畢,解鎖

num = -1

; pthread_mutex_unlock(&mut_num);

//5.收屍

for(i = left; i <= thrnum ;i++)

pthread_join(tid[i],null);

//6.銷毀互斥量

pthread_mutex_destroy(&mut_num);

exit(0);

}//執行緒:需要注意臨界區的跳轉一定要解鎖

void *thr_primer(void *p)

if(num == -1

)

i =num ;

num = 0

; pthread_mutex_unlock(&mut_num);

mark = 1

;

for(j = 2; j < i/2; j++)

}if(mark)

printf(

"[%d]%d is a primer.\n

",(int

)p,i);

}pthread_exit(null);

}

Linux 執行緒同步與互斥

多個執行緒併發的操作共享變數,會帶來 些問題。假設兩個執行緒讀寫相同變數時,執行緒a讀取變數然後給這個變數賦予乙個新的值,但寫操作需要兩個儲存週期。當執行緒b在這兩個寫週期讀取這個變數時,可能會得到不一致的值。為了避免這個問題,就需要互斥,同一時間只允許乙個執行緒訪問該變數。假設乙個場景,現有100...

linux 執行緒 linux多執行緒同步 互斥鎖

linux多執行緒程式設計 互斥鎖 鎖機制多執行緒之間可能需要互斥的訪問一些全域性變數,這就需要互斥的來訪問,這些需要共享訪問的字段被稱作是臨界資源,訪問臨界資源的程式段稱作是臨界區。實現執行緒間的互斥與同步機制的是鎖機制,下面是常用的鎖機制的函式和類 pthread mutex t mutex 鎖...

Linux 執行緒同步 互斥量(互斥鎖)

1 執行緒同步的目的是不管執行緒之間的執行如何穿插,其執行結果都是正確的。即保證多執行緒執行下結果的確定性。2 同步就是讓所有執行緒按照一定的規則執行,使得其正確性和效率都有跡可循,即執行緒同步就是對執行緒之間的穿插進行控制。3 每個物件都對應於乙個 互斥鎖 的標記,這個標記用來保證在任一時刻,只能...