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