互斥锁(互斥量)
主要应用函数: (1)pthread_mutex_init() ---------------------mutex =1
(2)pthread_mutex_lock():阻塞等待锁
(3)pthread_mutex_trylock():非阻塞且有返回;成功 0;失败返回 错误号:EBUSY正在被其他程序使用
(4)pthread_mutex_unlock()
(5)pthread_mutex_destroy()
pthread_mutex_t 类型本质是一个结构体,为了理解方便当作整数看待;
pthread_mutex mutex; mutex变量只有两种取值 1或0;
restrict关键字:修饰指针,表示改指针指向的空间,只能通过该指针访问和修改,其他都不行;
死锁:
(1)一个锁的情况:加锁之后没有释放又加一次锁(一下lock了两次,第二次一直等待);(代码二)
(2)两个锁的情况:拿到A锁的继续请求B锁,拿到B锁的继续请求A锁;相互请求形成死锁;(代码三)
解决方法:
(1)一个锁:第二次lock锁之前 trylock 非阻塞加锁尝试一下,判断返回值是否是EBUSY;
(2)两个锁:拿到一个锁的时候,第二个锁用 tyrlock 非阻塞加锁尝试一下,失败则不请求加锁,并且释放已经lock掉的所有锁;
(俩个锁的情况即:若请求第二次失败,释放自己所有锁,成全他人)
代码一-----互斥锁的简单使用
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<pthread.h>
#include<time.h>
pthread_mutex_t mutex;
void *pthread_func(void *arg)
{
int num=0;
srand(time(NULL));
while(1)
{
pthread_mutex_lock(&mutex);
printf("hello");
sleep(rand()%3);//模拟长时间工作,cpu易主的情况
printf(" world\n");
pthread_mutex_unlock(&mutex);
sleep(rand()%3);
}
}
int main()
{
pthread_t tid;
srand(time(NULL));
pthread_mutex_init(&mutex,NULL);
int ret = pthread_create(&tid,NULL, pthread_func,NULL);
if(ret!= 0)
{
printf("pthread_cteate error\n");
exit(1);
}
while(1)
{
pthread_mutex_lock(&mutex);
printf("HELLO");
sleep(rand()%3);//模拟线程长时间工作,cpu易主的情况
printf(" WORLD\n");
pthread_mutex_unlock(&mutex);//包围的共享资源越小越好
sleep(rand()%3);
}
}
代码二-----------一个锁的死锁情况以及解决办法
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<pthread.h>
#include<time.h>
pthread_mutex_t mutex;
void *pthread_func(void *arg)
{
int num=0;
srand(time(NULL));
while(1)
{
pthread_mutex_lock(&mutex);
printf("hello");
sleep(rand()%3);//模拟长时间工作,cpu易主的情况
printf(" world\n");
sleep(rand()%3);
//pthread_mutex_lock(&mutex); // 产生死锁
int ret = pthread_mutex_trylock(&mutex); //死锁的解决办法
if(ret != 0)
{
printf("trylock error\n");
}
pthread_mutex_unlock(&mutex);
}
}
int main()
{
pthread_t tid;
srand(time(NULL));
pthread_mutex_init(&mutex,NULL);
int ret = pthread_create(&tid,NULL, pthread_func,NULL);
if(ret!= 0)
{
printf("pthread_cteate error\n");
exit(1);
}
while(1)
{
pthread_mutex_lock(&mutex);
printf("HELLO");
sleep(rand()%3);//模拟线程长时间工作,cpu易主的情况
printf(" WORLD\n");
pthread_mutex_unlock(&mutex);//包围的共享资源越小越好
sleep(rand()%3);
}
}
代码三 ----------------两个锁产生的死锁情况
pthread_mutex_t mutex1;
pthread_mutex_t mutex2;
void *pthread_func(void *arg)
{
int num=0;
srand(time(NULL));
while(1)
{
pthread_mutex_lock(&mutex2);
printf("hello");
sleep(rand()%3);//模拟长时间工作,cpu易主的情况
printf(" world\n");
pthread_mutex_lock(&mutex1);
pthread_mutex_unlock(&mutex1);
sleep(rand()%3);
}
}
int main()
{
pthread_t tid;
srand(time(NULL));
pthread_mutex_init(&mutex1,NULL);
pthread_mutex_init(&mutex2,NULL);
int ret = pthread_create(&tid,NULL, pthread_func,NULL);
if(ret!= 0)
{
printf("pthread_cteate error\n");
exit(1);
}
while(1)
{
pthread_mutex_lock(&mutex1);
printf("HELLO");
sleep(rand()%3);//模拟线程长时间工作,cpu易主的情况
printf(" WORLD\n");
pthread_mutex_lock(&mutex2);
pthread_mutex_unlock(&mutex1);//包围的共享资源越小越好
sleep(rand()%3);
}
}