ホームページ  >  記事  >  バックエンド開発  >  C# がマルチスレッド下でスレッドの安全性を確保する方法を共有する

C# がマルチスレッド下でスレッドの安全性を確保する方法を共有する

Y2J
Y2Jオリジナル
2017-04-17 16:43:192518ブラウズ

マルチスレッドプログラミング シングルスレッドと比較すると、スレッドの安全性の問題という特有の問題があります。いわゆるスレッド セーフティとは、コードが配置されているプロセスで複数のスレッドが同時に実行されている場合、これらのスレッドがこのコードを同時に実行できることを意味します。各実行の結果がシングルスレッド実行の結果と同じであり、他の変数の値も期待どおりである場合。 スレッドの安全性の問題は、グローバル変数と静的変数によって引き起こされます。

マルチスレッド状況で静的変数にアクセスする際のセキュリティを確保するために、以下に示すように、ロック機構を使用してそれを保証できます:

//ロックする必要がある静的グローバル変数

 private static bool _isOK = false;
        //lock只能锁定一个引用类型变量
        private static object _lock = new object();
        static void MLock()
        {
            //多线程
            new System.Threading.Thread(Done).Start();
            new System.Threading.Thread(Done).Start();
            Console.ReadLine();
        }
        static void Done()
        {
            //lock只能锁定一个引用类型变量
            lock (_lock)
            {
                if (!_isOK)
                {
                    Console.WriteLine("OK");
                    _isOK = true;
                }
            }
        }

It should Lock は参照型の Live オブジェクトのみをロックできることに注意してください。さらに、ロック メカニズムに加えて、C# の上位バージョンでは、以下に示すように、スレッドの安全性を確保するために async メソッドと await メソッドが追加されました:

public static class AsynAndAwait
{
        //step 1 
        private static int count = 0;
        //用async和await保证多线程下静态变量count安全
        public async static void M1()
        {
            //async and await将多个线程进行串行处理
            //等到await之后的语句执行完成后
            //才执行本线程的其他语句
            //step 2
            await Task.Run(new Action(M2));
            Console.WriteLine("Current Thread ID is {0}", System.Threading.Thread.CurrentThread.ManagedThreadId);
            //step 6
            count++;
            //step 7
            Console.WriteLine("M1 Step is {0}", count);
        }
        public static void M2()
        {
            Console.WriteLine("Current Thread ID is {0}", System.Threading.Thread.CurrentThread.ManagedThreadId);
            //step 3
            System.Threading.Thread.Sleep(3000);
            //step 4
            count++;
            //step 5
            Console.WriteLine("M2 Step is {0}", count);
        }
}

タイミング図では、2 つのスレッドが相互作用していることがわかります。下図に示す Show:

C# がマルチスレッド下でスレッドの安全性を確保する方法を共有する

async と await を使用した後の上記コードの実行シーケンスは下図のようになります。

C# がマルチスレッド下でスレッドの安全性を確保する方法を共有する

グローバル変数と静的変数の読み取り操作のみの場合各スレッドで実行されますが、書き込み操作は行われません。一般的に、このグローバル変数はスレッドセーフです。複数のスレッドが変数に対して読み取りおよび書き込み操作を同時に実行する場合は、通常、スレッドの同期を考慮する必要があります。そうしないと、スレッドの安全性が損なわれる可能性があります。影響を受けました

以上がC# がマルチスレッド下でスレッドの安全性を確保する方法を共有するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。