【问题标题】:static variable inside function vs static class variable in c++函数内的静态变量与c ++中的静态类变量
【发布时间】:2016-08-30 04:18:18
【问题描述】:

对于某些对象的唯一 ID,我可以通过两种方式创建计数器,但我不知道 哪个更好,虽然它们在代码中完全不同(尽管可能不是字节码,我不知道)。

第一种方法是使用一些使用静态变量的函数:

标题:

unsigned int GetNextID();

cpp:

unsigned int GetNextID()
{
    static unsigned id{0};
    return id++;
}

另一个选项:

标题:

class UniqueIdGenerator
{
public:
    static unsigned int GetNextID();

private:
    static unsigned int mID;
}

cpp:

unsigned int UniqueIdGenerator::mID = 1;

unsigned int UniqueIdGenerator::GetNextID()
{
    return ++mID;
}

仅供参考,我read 认为前者不是线程安全的,但我不明白为什么后者也是。如果有的话,我更喜欢简单的功能,因为它更简单、更短。

【问题讨论】:

  • FWIW,你是对的。两种实现都不是线程安全的。
  • 只是为了让它更清楚,因为出于某种原因人们关注线程安全(如果我的问题含糊不清,我很抱歉):我在问为什么任何一种方法都会更好。如果它们只是线程不安全,那么线程安全不应该进入讨论。

标签: c++ static static-variables translation-unit


【解决方案1】:

为了使其线程安全,您应该更改为std::atomic<unsigned> mID,并将您的函数编写为

return mID.fetch_add(1);

您选择哪个版本无关紧要,尽管我认为免费函数是我更喜欢的版本,因为无法访问函数外部的变量。

【讨论】:

    【解决方案2】:

    区别在于静态变量的范围/可见性。一个类成员可以被多个方法共享,方法中的变量不能。

    本着数据尽可能私有的原则,方法中的静态变量如果满足你的需要会更安全。

    有关在初始化变量时线程安全的讨论,请参阅this question.,但使用该变量不是线程安全的,除非您采取一些措施来确保它受到保护(使用和原子(首选简单值),或者用互斥锁保护它(如果有多个数据需要保护))

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-29
      • 1970-01-01
      • 1970-01-01
      • 2015-06-20
      • 1970-01-01
      相关资源
      最近更新 更多