この記事は2020年10月10日に投稿しました。
目次
リンク
1. はじめに
こんにちは、iOSのエディタアプリPWEditorの開発者の二俣です。
今回は業務で使用しているC++/CLIでセマフォを使用する方法についてです。
2. C++/CLIでセマフォを使用する
C++/CLIでセマフォを使用するには、SemaphoreSlimクラスを使用します。
実装例
※MicrosoftのC#のサンプル例をC++/CLIに書き直した。
using namespace System; using namespace System::Threading; ref class Example { private: static SemaphoreSlim^ pool; static int padding; public: Example() { pool = gcnew SemaphoreSlim(0, 3); for (int i = 0; i <= 5; ++i) { ParameterizedThreadStart^ start = gcnew ParameterizedThreadStart(this, &Example::Worker); Thread^ thread = gcnew Thread(start); thread->Start(i); } Thread::Sleep(500); Console::WriteLine("Main thread calls Release(3)."); pool->Release(3); Console::WriteLine("Main thread exits."); } private: void Worker(Object^ num) { Console::WriteLine("Thread {0} begins and waits for the semaphore.", num); pool->Wait(); int padding = Interlocked::Add(this->padding, 100); Console::WriteLine("Thread {0} enters the semaphre.", num); Thread::Sleep(1000 + padding); Console::WriteLine("Thread {0} releases the semaphre.", num); Console::WriteLine("Thread {0} previous semaphore count: {1}", num, pool->Release()); } }; [STAThreadAttribute] int main() { Example^ example = gcnew Example(); Console::ReadKey(); return 0; }
実行結果
Thread 0 begins and waits for the semaphore. Thread 4 begins and waits for the semaphore. Thread 1 begins and waits for the semaphore. Thread 5 begins and waits for the semaphore. Thread 3 begins and waits for the semaphore. Thread 2 begins and waits for the semaphore. Main thread calls Release(3). Main thread exits. Thread 4 enters the semaphre. Thread 0 enters the semaphre. Thread 1 enters the semaphre. Thread 0 releases the semaphre. Thread 0 previous semaphore count: 0 Thread 3 enters the semaphre. Thread 4 releases the semaphre. Thread 4 previous semaphore count: 0 Thread 5 enters the semaphre. Thread 1 releases the semaphre. Thread 1 previous semaphore count: 0 Thread 2 enters the semaphre. Thread 3 releases the semaphre. Thread 3 previous semaphore count: 0 Thread 5 releases the semaphre. Thread 5 previous semaphore count: 1 Thread 2 releases the semaphre. Thread 2 previous semaphore count: 2
API Reference
3. おわりに
排他制御について調べていて、セマフォについても調べてみました。
C++/CLIの場合、SemaphoreクラスではなくSemaphoreSlimクラスを使用するようです。
リンク
紹介している一部の記事のコードは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