この記事は2019年11月14日に投稿しました。
目次
リンク
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