プログラムを書こう!

実務や自作アプリ開発で習得した役に立つソフトウェア技術情報を発信するブログ

C#のlockで排他制御を行う

この記事は2019年11月14日に投稿しました。

f:id:paveway:20190914064630j:plain

目次

  1. はじめに
  2. C#のlockで排他制御を行う
  3. おわりに

1. はじめに

こんにちは、iOSのエディタアプリPWEditorの開発者の二俣です。
今回は業務で使用しているC#のlockで排他制御を行う方法についてです。

目次へ

2. C#のlockで排他制御を行う/a>

C#のlockで排他制御を行う方法ですが、以下の実装例のように行います。

実装例

using System;
using System.Threading;

namespace CSharpLock
{
    class Program
    {
        // 排他制御に使用するオブジェクト
        private Object lockObject = new Object();

        // 各スレッドから操作する変数
        private int count;

        static void Main(string[] args)
        {
            var program = new Program();

            // func1の処理を行うスレッドを生成し、処理を開始します。
            var thread1 = new Thread(new ThreadStart(program.func1));
            thread1.Start();

            // func2の処理を行うスレッドを生成し、処理を開始します。
            var thread2 = new Thread(new ThreadStart(program.func2));
            thread2.Start();

            Console.ReadKey();
        }

        // スレッドで処理するメソッド
        private void func1()
        {
            // 排他制御します。
            // 先にlockした方の処理(func1)が終わるまで、次にlockした処理(func2)は待たされます。
            lock (lockObject)
            {
                for (var i = 0; i < 10; ++i)
                {
                    ++count;
                    Console.WriteLine($"func1 {count}");
                }

                Thread.Sleep(100);
            }
        }

        // スレッドで処理するメソッド
        private void func2()
        {
            // 排他制御します。
            lock (lockObject)
            {
                for (var i = 0; i < 10; ++i)
                {
                    ++count;
                    Console.WriteLine($"func2 {count}");
                }

                Thread.Sleep(70);
            }
        }
    }
}

実行結果

func1の処理が終わってから、func2の処理が行われます。
各メソッドのlock行をコメントアウトすると、func1とfunc2の処理が順番に行われなくなります。

func1 1
func1 2
func1 3
func1 4
func1 5
func1 6
func1 7
func1 8
func1 9
func1 10
func2 11
func2 12
func2 13
func2 14
func2 15
func2 16
func2 17
func2 18
func2 19
func2 20

API Reference

lockステートメント

目次へ

3. おわりに

ログ処理で、出力処理を排他制御する方法を調べてみました。

紹介している一部の記事のコードはGitlabで公開しています。
興味のある方は覗いてみてください。

目次へ


私が勤務しているニューラルでは、主に組み込み系ソフトの開発を行っております。
弊社製品のハイブリッドOS Bi-OSは高い技術力を評価されており、特に制御系や通信系を得意としています。
私自身はiOSモバイルアプリウィンドウズアプリを得意としております。
ソフトウェア開発に関して相談などございましたら、お気軽にご連絡ください。

また一緒に働きたい技術者の方も随時募集中です。
興味がありましたらご連絡ください。

EMAIL : info-nr@newral.co.jp / m-futamata@newral.co.jp
TEL : 042-523-3663
FAX : 042-540-1688

目次へ