mutex在Linux中称为互斥量,由mutex实现的锁叫做互斥锁。Java中对于重量级锁(关键字10)的实现就是mutex。
mutex为什么叫做重量级锁?
因为互斥的特点是拿不到锁就sleep,调用sleep()会进入到内核态,发生了一次系统调用。
pthread_mutex 定义
pthread_mutex_lock 定义
:::tips
int pthread_mutex_init(pthread_mutex_t mutex, const pthread_mutexattr_t attr);
:::
使用mutex
mutextest.c
#include <stdio.h>#include <stdlib.h>#include <pthread.h>int sharei = 0; //定义一个全局变量void increase_num(void);// add mutexpthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;//PTHREAD_MUTEX_INITIALIZER是一个宏,会去调用OS的pthread_mutex_init函数int main(){int ret;pthread_t thread1,thread2,thread3;ret = pthread_create(&thread1,NULL,(void *)&increase_num,NULL);ret = pthread_create(&thread2,NULL,(void *)&increase_num,NULL);ret = pthread_create(&thread3,NULL,(void *)&increase_num,NULL);//pthread_join 防止主线程直接结束pthread_join(thread1,NULL);pthread_join(thread2,NULL);pthread_join(thread3,NULL);printf("sharei = %d\n",sharei);return 0;}//runvoid increase_num(void){long i,tmp;for(i =0;i<=9999;++i){//上锁pthread_mutex_lock(&mutex);//有同学问为什么不加锁会小于30000//比如当t1 执行到tmp=sharei的时候假设 sharei这个时候=0,那么tmp也等于0//然后tmp=tmp+1;结果tmp=1(t1);这个时候如果t2进入了//t2获取的sharei=0;然后重复t1的动作 tmp=1(t2)//t2 sharei = tmp; sharei = 1;//然后CPU切回t1 执行 sharei = tmp; sharei = 1;//结果两个线程执行了两遍但是结果还是sharei = 1;(本来要等于2的)tmp=sharei;tmp=tmp+1;sharei = tmp;//解锁pthread_mutex_unlock(&mutex);}}
编译mutextest.c
gcc mutextest.c -o mu -pthread
注释掉加锁的代码
放开加锁的代码

