読者です 読者をやめる 読者になる 読者になる

C#のlock構文

FruitsNinjaのCloneのソースコードを見ていてc#にlock構文があることを知りました。

https://www.assetstore.unity3d.com/jp/#!/content/65879


マルチスレッドのプログラムでは、ちゃんと排他制御をしないと問題がおきます。

その代表格がsingletonクラスで、自分もC++でゲーム作ってたときは、それ周りのバグで悩まされました。

上記のAssetでは、singletonの生成時にロックを掛けるようになっています。

簡略化して書くと、

private static object _lock = new object();

public static T Instance
{
    get
    {
        lock (_lock)
        {
            if (_instance == null)
            {
                _instance = (T)FindObjectOfType(typeof(T));

                if (_instance == null)
                {
                    GameObject singleton = new GameObject();
                    _instance = singleton.AddComponent<T>();
                    singleton.name = "(singleton) " + typeof(T).ToString();

                    DontDestroyOnLoad(singleton);
                }
            }

            return _instance;
        }
    }
}

というような感じになっています。

これをちゃんとやっておかないと、タイミングによってはシングルトンなのにオブジェクトが複数できちゃいます。

けど、そもそもUnityのユーザースクリプトってシングルスレッドで動いていると聞いたので、そんなに神経質にlockしなくても良いんじゃ...って思ったり。そのあたりどうなんでしょう???