线程同步--------互斥锁(互斥量)以及他的死锁问题

互斥锁(互斥量)

主要应用函数: (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);
        }
}
         
发布了52 篇原创文章 · 获赞 14 · 访问量 5611

猜你喜欢

转载自blog.csdn.net/YanWenCheng_/article/details/104078652