【问题标题】:In glibc <= 2.23, why is `0;` used in mutex_lock macro?在 glibc <= 2.23 中,为什么在 mutex_lock 宏中使用 `0;`?
【发布时间】:2020-08-09 16:53:57
【问题描述】:

For glibc <= 2.23,看起来 malloc 的 mutex_lock 宏的通用定义使用 int 作为互斥体。 1 表示正在使用,0 表示免费。

它定义了这组通用宏:

typedef int mutex_t
# define mutex_init(m)          (*(m) = 0)
# define mutex_lock(m)          ({ *(m) = 1; 0; })
# define mutex_trylock(m)       (*(m) ? 1 : ((*(m) = 1), 0))
# define mutex_unlock(m)        (*(m) = 0)

对于mutex_lock(m)0; 的作用是什么?

【问题讨论】:

  • 可能记录为成功返回0
  • 0; 是一个没有副作用的声明。它没有设置返回值。
  • 如果您阅读the GCC statement expression documentation,您会看到“复合语句中的最后一件事应该是一个后跟分号的表达式;这个子表达式的值用作整个构造的值。”简而言之,它将充当返回值。
  • 好样的!学到了一些新东西。因此,如果0; 不存在,则返回值为 1。谢谢!

标签: c malloc c-preprocessor glibc


【解决方案1】:

表达式({ *(m) = 1; 0; }) 是标准C 的GCC 扩展,称为statement expression。它允许您在一个表达式中包含多个任意语句。

但所有非空表达式都必须产生一个值,并且 for 语句表达式

[t]复合语句中的最后一件事应该是一个后跟分号的表达式;这个子表达式的值作为整个构造的值

所以最后一个0; 只是表达式的结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-04
    • 2012-03-18
    • 2016-03-01
    • 2013-06-23
    • 1970-01-01
    • 2010-11-24
    • 2016-01-27
    相关资源
    最近更新 更多