互斥锁是多线程同步的一种方式,当多个线程访问同一个变量时,最简单的方法就是使用一个互斥锁(mutex)保护这个共享变量,防止出现资源抢占的问题。
下面是未加互斥锁时:
#include<stdio.h>
#include<pthread.h>
pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER; //静态初始化锁
int n=0; //共享变量
void* func1(void *arg)
{
int i;
for(i=0;i<15;i++)
{
//pthread_mutex_lock(&mutex); //上锁
n++;
printf("func1 is=%d\n",n);
//pthread_mutex_unlock(&mutex); //解锁
}
pthread_exit(NULL);
}
void* func2(void *arg)
{
int i;
for(i=0;i<15;i++)
{
//pthread_mutex_lock(&mutex);
n++;
printf("func2 is=%d\n",n);
//pthread_mutex_unlock(&mutex);
}
pthread_exit(NULL);
}
int main()
{
pthread_t t1,t2;
pthread_create(&t1,NULL,func1,NULL);
pthread_create(&t2,NULL,func2,NULL);
pthread_join(t1,NULL);
pthread_join(t2,NULL);
return 0;
}
输出结果:
可以看到,16以后输出了3,并未按照预想的顺序输出。
加锁后的输出:
输出符合预期,没有出现资源抢占的现象。在for循环中频繁的加锁与解锁是不合理的,但是此处是为了测试多线程的资源抢占问题,可以暂时忽略效率。
接下来总结一下多线程另一种同步方式-条件变量的使用。