執行緒同步
互斥量:某乙個資源可能在使用的過程中產生競爭和衝突。那麼互斥量解決同一時刻只有執行緒對資源進行操作。限制的是**。
/**********************
*功能:銷毀乙個互斥量
*引數: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 每個物件都對應於乙個 互斥鎖 的標記,這個標記用來保證在任一時刻,只能...