互斥锁
- 什么是互斥锁:
互斥锁是用来保证同一时间内某段代码只能由一个线程执行。
- 互斥锁的声明:
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才能继续执行下去。