天天看點

Linux下的多線程程式設計——同步互斥問題(互斥鎖) 互斥鎖

互斥鎖

  • 什麼是互斥鎖:

互斥鎖是用來保證同一時間内某段代碼隻能由一個線程執行。

  • 互斥鎖的聲明:
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;
}
           

輸出結果:

Linux下的多線程程式設計——同步互斥問題(互斥鎖) 互斥鎖

說明:

結果中可以看出,明明是先執行了average_n函數,輸出了"test2",但是由于主函數中之前就将mutex2鎖占用了,于是在遇到pthread_mutex_lock(&mutex2)時,該線程就被阻塞不能繼續執行了,反而先将sum_n函數中内容執行完了,并執行到pthread_mutex_unlock(&mutex2)這裡把mutex2解鎖了,average_n才能繼續執行下去。

繼續閱讀