互斥鎖
- 什麼是互斥鎖:
互斥鎖是用來保證同一時間内某段代碼隻能由一個線程執行。
- 互斥鎖的聲明:
pthread_mutex_t mutex;
- 互斥鎖初始化函數:
pthread_mutex_init( &mutex, NULL);
- 加鎖函數:
int pthread_mutex_lock(pthread_mutex_t *mutex);
- 解鎖函數:
int pthread_mutex_unlock(pthread_mutex_t *mutex);
說明:加鎖段的代碼同一時間隻能被一個線程調用執行。當一個線程執行到pthread_mutex_lock處時,如果此時另一個線程正在使用該鎖,則将阻塞此線程,直到另一個線程釋放此互斥鎖。
- 互斥鎖的銷毀:
pthread_mutex_destroy(phtread_mutex_t *lock)
- 實驗一:互斥鎖的實踐:
背景說明:用于求前n個數之和,并利用求出來的和來求前n個數的平均值。将求和與求平均值都在子線程中實作,這就必然需要我們先執行求和的子線程,再執行求平均值的子線程,這就需要我們利用互斥鎖來解決這個問題。
#include <stdio.h>
#include <pthread.h>
int n = 10;
int sum = 0;
double average = 0;
pthread_mutex_t mutex1;
pthread_mutex_t mutex2;//聲明兩個互斥鎖
void *sum_n(){
printf("test1\n");
pthread_mutex_lock(&mutex1);
printf("executing sum_n\n");
int i;
for(i = 1; i <= n; i++){
sum += i;
}
pthread_mutex_unlock(&mutex2);
}
void *average_n(){
printf("test2\n");
pthread_mutex_lock(&mutex2);
printf("executing average_n\n");
average = (double)sum / n;
// pthread_mutex_unlock(&mutex1);
}
int main()
{
pthread_t tid[2];//聲明兩個子線程
pthread_mutex_init(&mutex1,NULL);
pthread_mutex_init(&mutex2,NULL);//初始化兩個互斥鎖
pthread_mutex_lock(&mutex2);
pthread_create(&tid[0], NULL, sum_n, NULL);
pthread_create(&tid[1], NULL, average_n, NULL);//建立兩個子線程,并執行對應的函數
pthread_join(tid[0], NULL);
pthread_join(tid[1], NULL);
printf("sum = %d\n", sum);
printf("average = %lf\n", average);
pthread_mutex_destroy(&mutex1);
pthread_mutex_destroy(&mutex2);
return 0;
}
輸出結果:
說明:
結果中可以看出,明明是先執行了average_n函數,輸出了"test2",但是由于主函數中之前就将mutex2鎖占用了,于是在遇到pthread_mutex_lock(&mutex2)時,該線程就被阻塞不能繼續執行了,反而先将sum_n函數中内容執行完了,并執行到pthread_mutex_unlock(&mutex2)這裡把mutex2解鎖了,average_n才能繼續執行下去。