CREATESEM  (関数)


セマフォを生成します。


CREATESEM(<数式>)


セマフォを生成し、セマフォIDを取得します。
セマフォIDがないと、他のセマフォ関連のコマンドは使用できませんので、セマフォの使用に先立ってこのCREATESEMコマンドを実行しなくてはなりません。
引数でタスクのキューイング(実行待ち)方式を指定します。複数のタスクが同じセマフォを待っている場合の実行順を決めます。
キューイング方式は次の2種類があります。
引 数
0
先着順
0以外
タスクのプライオリティ順

先着順は、TAKESEMコマンドを実行した順です。
タスクのプライオリティは、RUNコマンドのオプション(PRIORITY)で指定されたものです。
CREATESEMを実行すると、その時点でセマフォが存在する状態になりますので、GIVESEMを実行しなくても、TAKESEMを実行できます。
セマフォは32個生成することができます。



CREATESEM命令使用上の注意:
  • 間違った使用方法により発生する現象
    CREATESEM命令によりすでに生成されたセマフォIDを持つプログラムが動作中・一時停止待機中の場合に
    • SEMCREATEによりセマフォID格納変数を書き換える、
      あるいは
    • その変数の書き換えをティーチングペンダントなどから故意に行うとセマフォIDを持つプログラムがセマフォを獲得できずに待機中のままになります。
  • PRO1を起動しPRO2の動作中にSTOPキーにより瞬時停止を行います。その後PRO1を再起動すると、i1に格納されたセマフォIDが変更されるため、PRO3は無限にセマフォを待ち続けます。
    PROGRAM PRO1
    i1=CREATESEM(0)
    RUN PRO2
    RUN PRO3
    END
    PROGRAM PRO2
    TAKESEM i1
    ·
    ·
    ·
    GIVESEM i1
    ·
    ·
    ·
    END
    PROGRAM PRO3
    TAKESEM i1
    ·
    ·
    ·
    GIVESEM i1
    END

  • 発生時の対処方法
    この状態から抜け出すには、無限待ちになっているプログラム(例ではPRO3)を停止してから、呼び出し元のプログラム(例ではPRO1)を起動してください。
  • 正しく使用するために守っていただくこと
    待ち状態にあるセマフォのIDを書き換えないように注意してください。
    具体的には、以下の2点をお守りください。
    • 同一変数番号を使用するセマフォは明示的に削除されない限り、生成を一度だけにする。
    • セマフォIDを管理する変数は他の用途で利用しない。


DEFINT Li1, Li2, Li3 = 1
Li1 = CREATESEM(Li3)
'Li3で指定したキューイング方式でセマフォを生成し、
'Li1にセマフォIDを得ます。
Li2 = CREATESEM(Li3)
'Li3で指定したキューイング方式でセマフォを生成し、
'Li2にセマフォIDを得ます。
TAKESEM Li1
'Li1で指定されるセマフォを取得します。
TALESEM Li2, 100
'Li2で指定されるセマフォを取得します。ただし、100ms
'でタイムアウトします。
RUN samp1
GIVESEM Li1
'Li1で指定されるセマフォを持つ一つのタスクを待ち
'状態から解放します。
FLUSHSEM Li2
'Li2で指定されるセマフォを持つすべてのタスクを待
'ち状態から解放します。
DELETESEM Li1
'Li1で指定されるセマフォIDを持つセマフォを削除し
'ます。
DELETESEM Li2
'Li2で指定されるセマフォIDを持つセマフォを削除し
'ます。