この記事は2020年07月02日に投稿しました。
目次
リンク
1. はじめに
こんにちは、iOSのエディタアプリPWEditorの開発者の二俣です。
今回は業務で使用しているC++/CLIのMonitorで排他制御を行う方法についてです。
2. C++/CLIのMonitorで排他制御を行う
C++/CLIのMonitorで排他制御を行うには、以下のような実装にします。
実装例
main.cpp
using namespace System; using namespace System::Threading; ref class Sample { private: Object^ mLock; int mCount; public: Sample() { mLock = gcnew Object(); mCount = 0; // スレッドAを開始します。 ThreadStart^ threadStartA = gcnew ThreadStart(this, &Sample::ThreadA); Thread^ threadA = gcnew Thread(threadStartA); threadA->Start(); // スレッドBを開始します。 ThreadStart^ threadStartB = gcnew ThreadStart(this, &Sample::ThreadB); Thread^ threadB = gcnew Thread(threadStartB); threadB->Start(); } void ThreadA() { // 排他ロックを開始します。 Monitor::Enter(mLock); for (int i = 0; i < 10; ++i) { ++mCount; Console::WriteLine("ThreadA[" + mCount + "]"); } // 排他ロックを解除します。 Monitor::Exit(mLock); } void ThreadB() { // 排他ロックを開始します。 Monitor::Enter(mLock); for (int i = 0; i < 10; ++i) { ++mCount; Console::WriteLine("ThreadB[" + mCount + "]"); } // 排他ロックを解除します。 Monitor::Exit(mLock); } }; [STAThreadAttribute] int main() { Sample^ sample = gcnew Sample(); Console::ReadKey(); return 0; }
実行結果
最初に排他ロックをかけたスレッドの処理が終わった後、次のスレッドの処理が始まります。
排他ロックをかけないと、スレッドAとスレッドBの処理が入れ子で実行されます。
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クラス
Enterメソッド
Exitメソッド
3. おわりに
排他ロックの方法はいろいろあると思いますが、Monitorによる排他ロックは簡単に使えると思います。
リンク
紹介している一部の記事のコードはGitlabで公開しています。
興味のある方は覗いてみてください。
私が勤務しているニューラルでは、主に組み込み系ソフトの開発を行っております。
弊社製品のハイブリッドOS [Bi-OS][Bi-OS]は高い技術力を評価されており、特に制御系や通信系を得意としています。
私自身はiOSモバイルアプリやウィンドウズアプリを得意としております。
ソフトウェア開発に関して相談などございましたら、お気軽にご連絡ください。
また一緒に働きたい技術者の方も随時募集中です。
興味がありましたらご連絡ください。
EMAIL : info-nr@newral.co.jp / m-futamata@newral.co.jp
TEL : 042-523-3663
FAX : 042-540-1688