【问题标题】:Value of uninitialized semaphore未初始化信号量的值
【发布时间】:2010-10-19 13:03:05
【问题描述】:

参考Linux中semaphore.h的semaphore实现,未初始化的semaphore sem_t是否默认为0?

我刚刚发现我忘记将我的信号量初始化为 0。即便如此,程序在没有 sem_init 的情况下也能正常工作。

(对于所有纯粹主义者,我完全同意这样做是一种不好的做法。)

【问题讨论】:

  • 它是否在具有完整优化设置的发布模式下工作?
  • 我不确定你的意思,你是在说编译器优化吗?

标签: c linux unix posix semaphore


【解决方案1】:

这取决于信号量的定义方式/位置。

  • 如果它被定义为(部分)全局变量,那么如果您不指定任何值,编译器必须将其初始化为 0
  • 当它是声明为 static 的块范围变量(的一部分)时也是如此。
  • 如果它是(部分)非static 块范围变量,那么它将以之前存储在该内存位置的任何值开始。

【讨论】:

    【解决方案2】:

    我相信它是正式的“未定义”。也就是说,它可以是任何东西。在您的情况下,由于某种原因,它恰好是 0,但这只是运气。明天可能是 5 点。

    【讨论】:

      【解决方案3】:

      这取决于编译器,而不是操作系统/信号量实现。在这种情况下,Bart 的回答涵盖了 C 标准。

      但是,根据Unix standard,您甚至不应该依赖sem_t 为0,甚至sem_t * 为NULL;在未初始化的变量上使用 sem_init 应该是安全的。为信号量指定的唯一特殊值是 sem_t *SEM_FAILED,其值是特定于实现的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-05-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多