__weak修饰符

前言

在 HAL 库中,很多回调函数前面使用__weak 修饰符。

 weak 顾名思义是“弱”的意思,所以如果函数名称前面加上__weak 修饰符,我们一般称这个函数为“弱函数”。

加上了__weak 修饰符的函数,用户可以在用户文件中重新定义一个同名函数,最终编译器编译的时候,会选择用户定义的函数,如果用户没有重新定义这个函数,
那么编译器就会执行__weak 声明的函数,并且编译器不会报错。

 举个例子

我们打开工程模板,找到并打开文件stm32f4xx_hal.c 文件,里面定义了一个函数 HAL_MspInit,定义如下:

__weak void HAL_MspInit(void)
{
__IO uint32_t tmpreg = 0x00;
UNUSED(tmpreg);
}

可以看出,HAL_MspInit 函数前面有加修饰符__weak。同时,在该文件的前面有定义函数HAL_Init,并且 HAL_Init 函数中调用了函数 HAL_MspInit。

HAL_StatusTypeDef HAL_Init(void)
{
…//此处省略部分代码
HAL_MspInit();
return HAL_OK;
}

如果我们没有在工程中其他地方重新定义 HAL_MspInit()函数,那么 HAL_Init 初始化函数执行的时候,会默认执行 stm32f4xx_hal.c 文件中定义的 HAL_MspInit 函数,而这个函数没有任何控制逻辑。 如果用户在工程中重新定义函数 HAL_MspInit,那么调用 HAL_Init 之后

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: compare_exchange_weak是C++11中的一个原子操作函数,用于比较并交换操作。它可以在多线程环境下保证数据的原子性,避免出现数据竞争的情况。与compare_exchange_strong相比,它的弱版本在交换操作失败时不会抛出异常,而是返回一个bool值表示操作是否成功。 ### 回答2: compare_exchange_weak是C++中的原子操作函数之一。它的作用是比较给定的值和内存中的值,如果相等,则将内存中的值替换为一个新的值。 compare_exchange_weak函数的使用方式如下: ``` bool compare_exchange_weak(T& expected, T desired); ``` 其中,expected是一个引用参数,表示期望的值;desired是新的值。函数首先比较内存中的值和expected,如果相等,则将内存中的值替换为desired并返回true;如果不相等,则将内存中的值赋给expected并返回false。 compare_exchange_weak函数是弱的比较和替换原子操作。之所以称为"弱",是因为它在比较和替换期间可能会受到其他线程的干扰,需要重试。这种重试可以保证代码的正确性,但可能会影响性能。 与之相对的是compare_exchange_strong函数,它是"强"的比较和替换原子操作。compare_exchange_strong函数不需要重试,因此使用起来更简单,但有可能导致不必要的循环开销。 需要注意的是,compare_exchange_weak函数的返回值不仅表示比较和替换的结果,还表示内存中的值是否被替换。因此,在使用该函数时,需要根据返回值判断操作是否成功。 总之,compare_exchange_weak是C++中的原子操作函数,用于比较给定值和内存中的值,并在相等时替换。它是一种弱的比较和替换操作,可能需要重试以保证正确性。 ### 回答3: compare_exchange_weak是一种原子操作,其目的是在多线程环境下实现对共享变量的原子比较和交换操作。在C++中,compare_exchange_weak函数通常与一个参数一起使用,该参数用于表示预期值。此函数会比较共享变量的值与预期值是否相等,如果相等,则将共享变量的值修改为新值,返回true;如果不相等,则不进行修改,返回false。 与compare_exchange_strong函数相比,compare_exchange_weak函数在性能上可能略有优势,但在并发度较高的情况下,可能会出现一些问题,因为它可能会被其他线程中断,导致原子操作失败。在这种情况下,函数会返回false,但同时还会返回共享变量的当前值,并将预期值修改为当前值。 compare_exchange_weak函数通常与循环结合使用,以确保原子操作的成功。在循环中,可以不断尝试进行原子操作,直到成功为止。这种方法可以有效地避免由于竞态条件而导致的共享变量值的错误结果。 总而言之,compare_exchange_weak函数是一种用于实现原子比较和交换操作的方式。尽管它在某些情况下可能会失败,但通过循环的方式,我们可以确保操作的成功,并保证共享变量的一致性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值