【问题标题】:"Shared" and "__gshared" Keywords in DD 中的“Shared”和“__gshared”关键字
【发布时间】:2011-01-29 08:39:52
【问题描述】:

当 not 在 static 上下文中使用时(即,当 static 关键字不存在,并且您不在全局范围内时),shared 做什么而__gshared关键字呢?

例子:

struct Temp
{
       shared int i;
    __gshared int j;
}

【问题讨论】:

    标签: shared d


    【解决方案1】:

    共享的 int 类型为 shared(int),它做任何事情,只是给它那个类型。 __gshared int 是无操作的——DMD 喜欢忽略无操作属性。

    【讨论】:

    • __gshared 不是空操作。它意味着静态。
    • 另外:虽然shared int 在当前用于局部变量的 dmd 实现中只表现得像一个类型限定符(例如const),但正确实现的shared - 我理解它的方式 -应该具有读取-获取和写入-释放-语义(即在许多架构上使用内存栅栏并避免某些编译器优化,另请参见digitalmars.com/d/2.0/faq.html#shared_memory_barriers)。这有时甚至与局部变量相关,例如,在其他线程中执行闭包的情况下(或在极少数情况下跨线程堆栈访问)。
    【解决方案2】:

    D2 默认为线程本地存储,而 C、C++ 和 D1 默认为全局存储。

    其中一个区别是 D 中的全局变量对其他线程可见,而 TLS 不可见。

    这听起来可能并不多,但请尝试在没有意识到这一点的情况下连接到 C 库。 (不可变的也是。全局的)

    IME __gshared 几乎只存在于强制某些东西进入全局,而通常它不会。

    它可能还有其他用途,但我还没有看到。

    C 头文件中的全局变量就是一个例子。如果您尝试与它交互,您将需要不可变或 __gshared。当然还有其他方法,但这可能是最简单的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-26
      • 2020-05-30
      • 1970-01-01
      • 1970-01-01
      • 2021-11-29
      相关资源
      最近更新 更多