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;
}

输出结果:


说明:

结果中可以看出,明明是先执行了average_n函数,输出了"test2",但是由于主函数中之前就将mutex2锁占用了,于是在遇到pthread_mutex_lock(&mutex2)时,该线程就被阻塞不能继续执行了,反而先将sum_n函数中内容执行完了,并执行到pthread_mutex_unlock(&mutex2)这里把mutex2解锁了,average_n才能继续执行下去。

猜你喜欢

转载自blog.csdn.net/zhao_yuting/article/details/79917643