プログラムを書こう!

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

C++/CLIでセマフォを使用する

この記事は2020年10月10日に投稿しました。

f:id:paveway:20190914064630j:plain

目次

  1. はじめに
  2. C++/CLIでセマフォを使用する
  3. おわりに

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

SemaphoreSlimクラス

目次へ

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

目次へ