互斥锁的使用

1、初始化互斥锁

mutex用pthread_mutex_t数据类型表示,在使用互斥锁前,必须先对它进行初始化。

静态分配的互斥锁:
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

动态分配互斥锁:
pthread_mutex_t mutex;
pthread_mutex_init(&mutex,NULL);

销毁互斥锁:
在所有使用过互斥锁的线程都不再需要使用时候,应调用pthread_mutex_destroy销毁互斥锁。

#include<pthread.h>
int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *attr);

功能:初始化一个互斥锁。

参数:
mutex:互斥锁地址。
attr:互斥锁的属性,NULL为默认的属性。

返回值:
成功:返回 0
失败:返回非 0

2、互斥锁上锁:

互斥锁上锁1

#include<pthread.h>
int pthread_mutex_lock(pthread_mutex_t *mutex);

功能:对互斥锁上锁,若已经上锁,则调用者一直阻塞到互斥锁解锁  

参数:
mutex:互斥锁地址。

返回值:
成功:返回 0
失败:返回非 0

互斥锁上锁2

#include<pthread.h>
int pthread_mutex_trylock(pthread_mutex_t *mutex);

功能:对互斥锁上锁,若已经上锁,则上锁失败,函数立即返回。

参数:
mutex:互斥锁地址。

返回值:
成功:返回 0
失败:返回非 0

一般情况下在互斥锁上锁的时候用的是pthread_mutex_lock这个函数。

3、互斥锁解锁:

#include<pthread.h>
int pthread_mutex_unlock(pthread_mutex_t *mutex);

功能:对指定的互斥锁解锁。

参数: 
mutex:互斥锁地址。

返回值:
成功:返回 0
失败:返回非 0

4、销毁互斥锁:

#include<pthread.h>
int pthread_mutex_destroy(pthread_mutex_t *mutex);

功能:销毁指定的一个互斥锁。

参数:
mutex:互斥锁地址。

返回值:
成功:返回 0
失败:返回非 0 

5、案例代码:

#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<pthread.h>

//通过互斥锁解决线程间互斥问题

int money = 10000;

//第一步:创建互斥锁(由于两个线程操作同一个互斥锁,所以定义在全局更加方便一点)
pthread_mutex_t mymutex;

void *pthread_fun1(void *arg)
{
        int get,yu,shiji;
        get = 10000;

        //第三步:对共享资源的操作进行上锁
        pthread_mutex_lock(&mymutex);

        printf("张三正在查询余额……\n");
        sleep(1);
        yu =money;

        printf("张三正在取钱……\n");
        sleep(1);
        if(get > yu)
        {
                shiji = 0;
        }

        else
        {
                shiji = get;
                yu = yu - get;
                money = yu;
        }

        printf("张三想取%d元,实际取了%d元,余额为%d元\n",get,shiji,yu);

        //第四步:当共享资源的操作执行完毕后,对互斥锁执行解锁操作
        pthread_mutex_unlock(&mymutex);

        pthread_exit(NULL);

}
void *pthread_fun2(void *arg)
{
        int get,yu,shiji;
        get = 10000;

        //第三步:对共享资源的操作进行上锁
        pthread_mutex_lock(&mymutex);

        printf("李四正在查询余额……\n");
        sleep(1);
        yu =money;

        printf("李四正在取钱……\n");
        sleep(1);
        if(get > yu)
        {
                shiji = 0;
        }

        else
        {
                shiji = get;
                yu = yu - get;
                money = yu;
        }

        printf("李四想取%d元,实际取了%d元,余额为%d元\n",get,shiji,yu);

        //第四步:当共享资源的操作执行完毕后,对互斥锁执行解锁操作
        pthread_mutex_unlock(&mymutex);

        pthread_exit(NULL);

}

int main(int argc,char const *argv[])

{

        //第二步:初始化操作
        pthread_mutex_init(&mymutex,NULL);

        pthread_t thread1,thread2;

        if(pthread_create(&thread1,NULL,pthread_fun1,NULL) != 0)
        {
                perror("fail to pthread_create");
                exit(1);
        }

        if(pthread_create(&thread2,NULL,pthread_fun2,NULL) != 0)
        {
                perror("fail to pthread_create");
                exit(1);
        }

        pthread_join(thread1,NULL);
        pthread_join(thread2,NULL);

        //第五步:当互斥锁使用完毕后,要销毁
        pthread_mutex_destroy(&mymutex);

        return 0;
}

运行结果:
在这里插入图片描述

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在FreeRTOS中,互斥用于保护共享资源,防止多个线程同时访问共享资源而引发的竞争条件。互斥使用步骤如下: 1. 定义互斥变量和互斥句柄:在代码中先定义一个互斥变量和一个互斥句柄,例如: ``` osMutexId resource_mutex = NULL; // 定义互斥句柄 osMutexDef(resource_mutex); // 定义互斥变量 ``` 2. 创建互斥:在初始化函数中创建互斥,例如: ``` void resource_mutex_init(void) { resource_mutex = osMutexCreate(osMutex(resource_mutex)); } ``` 3. 获取互斥:在需要使用共享资源的函数中,首先获取互斥,例如: ``` void function(void) { resource_mutex_acquire(); // 获取互斥 // 操作共享资源 resource_mutex_release(); // 释放互斥 } ``` 总结:在FreeRTOS中,使用互斥的步骤包括定义互斥变量和句柄、创建互斥、获取互斥以及释放互斥。通过这些步骤,可以确保多个线程对共享资源的安全访问。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [freertos互斥使用](https://blog.csdn.net/weixin_45379397/article/details/130604913)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [【FreeRTOS】互斥使用](https://blog.csdn.net/qq_43581670/article/details/127688331)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值