この記事は2022年06月02日に投稿しました。
目次
リンク
1. はじめに
こんにちは、iOSのエディタアプリPWEditorの開発者の二俣です。
今回は業務で使用しているC#のMonitorで排他制御を行う方法についてです。
2. C#のMonitorで排他制御を行う
C#のMonitorで排他制御を行うには、以下のような実装にします。
実装例
using System; using System.Threading; namespace SampleMonitor { class Sample { private object Lock; int Count; public Sample() { Lock = new object(); Count = 0; // スレッドAを開始します。 var startA = new ThreadStart(ThreadA); var threadA = new Thread(startA); threadA.Start(); // スレッドBを開始します。 var startB = new ThreadStart(ThreadB); var threadB = new Thread(startB); threadB.Start(); } public void ThreadA() { // 排他ロックを開始します。 Monitor.Enter(Lock); for (var i = 0; i < 10; ++i) { ++Count; Console.WriteLine($"ThreadA[{Count}]"); } // 排他ロックを解除します。 Monitor.Exit(Lock); } public void ThreadB() { // 排他ロックを開始します。 Monitor.Enter(Lock); for (var i = 0; i < 10; ++i) { ++Count; Console.WriteLine($"ThreadB[{Count}]"); } // 排他ロックを解除します。 Monitor.Exit(Lock); } } internal class Program { static void Main(string[] args) { var sample = new Sample(); Console.ReadKey(); } } }
実行結果
ThreadA[1] ThreadA[2] ThreadA[3] ThreadA[4] ThreadA[5] ThreadA[6] ThreadA[7] ThreadA[8] ThreadA[9] ThreadA[10] ThreadB[11] ThreadB[12] ThreadB[13] ThreadB[14] ThreadB[15] ThreadB[16] ThreadB[17] ThreadB[18] ThreadB[19] ThreadB[20]
API Reference
Monitorクラス
3. おわりに
以前C++/CLIで
を紹介しました。
今回C#で排他制御を行う必要があり、C#で書き直してみました。
リンク
紹介している一部の記事のコードはGitlabで公開しています。
興味のある方は覗いてみてください。
私が勤務しているニューラルでは、主に組み込み系ソフトの開発を行っております。
弊社製品のハイブリッドOS Bi-OSは高い技術力を評価されており、特に制御系や通信系を得意としています。
私自身はiOSモバイルアプリやウィンドウズアプリを得意としております。
ソフトウェア開発に関して相談などございましたら、お気軽にご連絡ください。
また一緒に働きたい技術者の方も随時募集中です。
興味がありましたらご連絡ください。
EMAIL : info-nr@newral.co.jp / m-futamata@newral.co.jp
TEL : 042-523-3663
FAX : 042-540-1688