我是靠谱客的博主 鳗鱼蜡烛,最近开发中收集的这篇文章主要介绍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("test1n");
pthread_mutex_lock(&mutex1);
printf("executing sum_nn");
int i;
for(i = 1; i <= n; i++){
sum += i;
}
pthread_mutex_unlock(&mutex2);
}
void *average_n(){
printf("test2n");
pthread_mutex_lock(&mutex2);
printf("executing average_nn");
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 = %dn", sum);
printf("average = %lfn", 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才能继续执行下去。

最后

以上就是鳗鱼蜡烛为你收集整理的Linux下的多线程编程——同步互斥问题(互斥锁) 互斥锁的全部内容,希望文章能够帮你解决Linux下的多线程编程——同步互斥问题(互斥锁) 互斥锁所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(42)

评论列表共有 0 条评论

立即
投稿
返回
顶部