对于互斥锁的一个深层次的理解 1. 互斥锁本身就是一个临界资源,所以对互斥锁的操作本身就是原子的。 2. 每次在线程 函数的内部,每次需要申请锁资源,如果申请失败,当前的线程就会被挂起,挂起就是该线程的PCB在等待队列里面。
死锁产生的情景 1. 多线程可能有多把锁,这个时候,如果其中的某些线程 都想要访问彼此的锁,这个时候可能 都拿不到,然后就产生了死锁。 2. 一个进程一把锁,可能由于代码错误,当它申请锁之后,已经 拿到了这把锁,然后他又去申请同样 的,这个时候就出现了死锁。
下面看代码的实现。
#include<stdio.h>
#include<pthread.h>
int count = 0;
pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER; //创建一把锁,使用宏进行初始化
void* pccount(void* arg)
{
int i = 0;
int temp = 0;
while(i<50000000)
{
pthread_mutex_lock(&lock); //加锁,如果锁资源是空,就拿到锁,如果锁资源不是空,就挂起等待
//temp=count;
count=count+1;
//printf("%d",temp);
i++;
pthread_mutex_unlock(&lock); //操作完临界资源之后,要解锁,这样其他的线程才能够获取锁资源
}
//printf("%d\n",count);
pthread_exit((void*)123);
}
int main()
{
pthread_t pid1;
pthread_t pid2;
int i = pthread_create(&pid1,NULL,pccount,NULL);
int m = pthread_create(&pid2,NULL,pccount,NULL);
void* join1;
void* join2;
pthread_join(pid1,&join1);
pthread_join(pid2,&join2); //这里必须要有线程等待,不然没有打印结果
pthread_mutex_destroy(&lock); //销毁锁资源
printf("%d\n",count);
return 0;
}