EAに排他処理を付ける。

Mick 2010/10/19 01:02
お役に立つかどうかわかりませんが、
文字列"semaphore"でヘルプを検索すると、
セマフォ使え的な記述が二つほど見つかるので、
自分はヘルプのやり方でセマフォを実装してます。
(なぜ役に立つかどうかわからないかというと、最初からセマフォを実装しているので、
本当に有効だったのかどうか、確認していないという。。。^^;)

昨日紹介した、特定の環境で不安定になりすぎるEAについて、セマフォによる排他処理はどうか?と貴重なコメントを頂きましたので、早速試してみました。

ヘルプに書かれたとおりに書いたところ、問題なく5000回のトレードを終えられました。
もちろん、5000回終えただけでは排他処理が完全である証明にはなりませんけど、少なくとも、特定の環境下では、セマフォは本当に有効だと言えます..。


この排他処理の原理は、↑グローバル環境変数にDATAFILE_SEM と言う変数を設けて、あるEAが処理を開始したらその数字を1とし、処理が終わったら0に戻すようにしています。他のEAはその数値が1の時は0に戻るのを待ちます。この数値を 0から 1にできるのは、複数のEAが同時に同じ処理をしても成功するのは1つのEAだけなので、排他制御が可能となるのです。
ちなみに、ヘルプに書かれたコードでは、

・あるEAの実行中に、他のEAの init() が実行された場合
・ユーザがうっかり、DATAFILE_SEM変数を削除してしまった場合
・あるEAが正しく終了できなかった場合(1のままになってしまう場合)

のような、滅多に無いけど、もしかしたら有り得る場合への対策が無いので、心配症の人はその辺りも考慮すると良いかもしれません。。