互斥量解决线程同步问题

目录

1.互斥量简介

 2.互斥量的函数原型

pthread_mutex_init

pthread_mutex_destroy

pthread_mutex_lock

pthread_mutex_trylock

pthread_mutex_unlock

3.案例源码


1.互斥量简介

简介:使用互斥量来确保同时仅有一个线程可以访问某项共享资源。

互斥量的两种状态:已锁定(locked)和未锁定(unlocked)

一旦线程锁定互斥量,随即成为该互斥量的所有者,只有所有者才能给互斥量解锁。

特殊情形:死锁

当超过一个线程加锁同一组互斥量,就有可能发生死锁

死锁的几种场景

1.忘记释放锁

2.重复加锁

3.多线程多锁,抢占锁资源

 2.互斥量的函数原型

互斥量的类型 pthread_mutex_t

pthread_mutex_init

int pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutexattr_t *restrict attr);

-功能:初始化互斥量

 - 参数 :
            - mutex : 需要初始化的互斥量变量
            - attr : 互斥量相关的属性,NULL
        - restrict : C语言的修饰符,被修饰的指针,不能由另外的一个指针进行操作。
            pthread_mutex_t *restrict mutex = xxx;
            pthread_mutex_t * mutex1 = mutex

pthread_mutex_destroy

int pthread_mutex_destroy(pthread_mutex_t *mutex);

-功能:释放互斥量的资源

pthread_mutex_lock

int pthread_mutex_lock(pthread_mutex_t *mutex);

-功能:加锁,阻塞的,如果有一个线程加锁了,那么其他的线程只能阻塞等待

pthread_mutex_trylock

int pthread_mutex_trylock(pthread_mutex_t *mutex);

-功能:尝试加锁,如果加锁失败,不会阻塞,会直接返回

pthread_mutex_unlock

int pthread_mutex_unlock(pthread_mutex_t *mutex);

-功能:解锁

3.案例源码

三个线程对票这个共享资源进行操作

#include<stdio.h>
#include<pthread.h>
#include<unistd.h>
//全局变量,所有的线程都共享这一份资源
int tickets=1000;

//创建一个互斥量
pthread_mutex_t mutex;

void *sellticket(void *arg){
    while(1){
        //加锁
        pthread_mutex_lock(&mutex);
        if(tickets>0){
            usleep(60000);
            printf("%ld 正在卖第 %d 张门票\n",pthread_self(),tickets);
            tickets--;
        }else{
            //解锁
            pthread_mutex_unlock(&mutex);
            break;
        }
        //解锁
        pthread_mutex_unlock(&mutex);
    }
    return NULL;
}
int main(){
    //初始化互斥量
    pthread_mutex_init(&mutex,NULL);

    //创建3个子线程
    pthread_t tid1,tid2,tid3;
    pthread_create(&tid1,NULL,sellticket,NULL);
    pthread_create(&tid2,NULL,sellticket,NULL);
    pthread_create(&tid3,NULL,sellticket,NULL);

    //回收子线程的资源,阻塞函数
    pthread_join(tid1,NULL);
    pthread_join(tid2,NULL);
    pthread_join(tid3,NULL);

    //退出主线程
    pthread_exit(NULL);

    //回收互斥量资源
    pthread_mutex_destroy(&mutex);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值