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才能继续执行下去。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值