代码之家  ›  专栏  ›  技术社区  ›  ngoozeff

在多线程C程序中执行一次性初始化

  •  3
  • ngoozeff  · 技术社区  · 16 年前

    下面的代码段对于在多线程程序中执行一次初始化是否“安全”?

    private static object initialized = false;
    
    public static void Initialize()
    {
      lock (initialized)
      {
        if ((bool)initialized == false)
        {
          DoInitialization();
          initialized = true;
        }
      }
    }
    

    请注意,我不能仅从Main或其他一些单线程上下文进行初始化。

    3 回复  |  直到 16 年前
        1
  •  4
  •   Mark Byers    16 年前

    你是对的-这是行不通的,因为你正在重新分配要锁定的对象。

    您可以使用两个独立的成员来实现这一点—一个只指定一次的要锁定的对象,然后是一个可以读取或指定的布尔值(锁定后)。

    您可能还需要考虑 singleton 在这里比较合适。

        2
  •  3
  •   Jordão    16 年前

    试试看 double-checked locking .

        private static volatile bool initialized = false;
        private static object syncObject = new object();
        public static void Initialize() {
            if (!initialized) {
                lock (syncObject) {
                    if (!initialized) {
                        DoInitialization();
                        initialized = true;
                    }
                }
            }
        }
    
        3
  •  1
  •   Ani    16 年前

    一些选项:

    1. 初始化静态构造函数,保证只运行一次。缺点:当你想初始化的时候很难控制。
    2. Lazy 类,这是线程安全的。

    这三种方法都可以用来创建单例。