2014-10-01 95 views
1

因为在C中没有静态初始化,我想懒洋洋地初始化一个全局的mtx_t(请保持你的反应速度)。对我来说使用布尔标志并不是什么问题,但我宁愿只检查mtx_t变量。有没有标准的mtx_t'invalid'状态?

C11的mtx_t有一个幸运的'无效状态'我可以检查变量吗?我在草案标准中找不到任何东西。

+0

我不认为有一个。 C11线程没有被广泛实现,文档也很差(在规范本身!)。所以如果你在规范中找不到任何东西,就是这样。 – 2014-10-01 21:34:07

回答

3

不,没有可以检查的无效状态,使用未初始化的mtx_t会导致未定义的行为。

对于mtx_t而言,没有静态初始值设定项的整个事情有点愚蠢,在任何常规架构上都可以毫无问题地完成。 POSIX有它。

此外,很容易将足够的状态添加到mtx_t以使其成为可能。你必须添加

  • 一个volatile int为你当初始化完成
  • ,你作为的情况下,自旋锁的第一标志是 0使用
  • 一个atomic_flag设置一个标志。在这种情况下,一旦你持有自旋锁
    • 测试的启动标志再次
    • 是否仍然0初始化mtx_t和启动标志设置为一个
    • 取消设置atomic_flag
+0

这是一个非常明确的描述,说明如何实现双重检查锁定 - volatile int标志有一个数据竞争。 – Casey 2014-10-02 06:24:15