【Lua】組み込み系言語総合 その7【Squirrel】 [無断転載禁止]©2ch.net
NGワードでテンプレが張れないのでざっくり削ってしまった
必要なら補完をお願い >前スレ999
リファレンスはあくまで言語リファレンスだから、踏み込んだ機能は Programing in Lua 読まないと駄目だよ
該当機能は13.4に解説されてる >>4
ありがとうございます
ttps://www.lua.org/pil/13.4.5.html
これですね。__indexは関数の節約や継承に相当する機能を実現するために
使いますけど[]の定義とこれらは両立は出来ない・・・?
__indexに[]にさせたい関数を入れてしまうとキーを参照しに行くテーブルを設定できませんし
__indexにテーブルを入れてしまうと[]にさせたい関数を書く場所がないような
>>5
すみません。気がつきませんでした。>>4を見た後に探し直したら見つかりました __indexメタメソッドに設定した関数の中から目的のテーブル参照すりゃ良いだけだと思うが ノンプリエンプティブなマルチタスクしか実現できないLuaでファイルアクセルの
オーバーヘッドを掩蔽することは不可能ですか?
IO待ち中にタスクを切り替えられないと思いますけど何か方法があるのでしょうか >>8
別スレッドで自動でファイル読み込みして、メモリへの読み込み終わったら通知が来るような仕組みを別途作ればいい Luaだけだと無理だね ホスト側で仕組みを作るしかない タスクの定義がなんだかよーわからへんけど、1つのスレッドで読み込み要求を発行した後、
そのままそのスレッドで円周率ん万桁とか計算したりした後、
読み込みが終わったかどうかを確認した上で読み込んだ内容をほげほげしたい、と仮定しよう
Win32だったら::ReadFile(::ReadFileEx)はプログラマがマルチスレッドを意識する事なく非同期読み書きが可能
キーワードはReadFile、GetOverlappedResult、
あとCancelIo(一度に沢山読み込むのを例外とかでキャンセルしたりする時に重要、
キャンセルしたら即全部止まる訳じゃないからGetOverlappedResultで待ち合わせないとダメよ)
Linuxの類ならスレッドなりプロセスのフォークなりして最初に読み込んで
単純にLuaスクリプトが追いついたらWait何とかみたいな関数バインドして待たせたらどうだろうか
で、どうしてもLuaが主導で要求を発行した上で自前の他のスレッドでやりたいってんなら
Luaにクリティカルセクションか非同期読み込みに使ったイベントへのアクセス手段を
ホスト(Luaスクリプトを使う側から見た内部)で存続から何から何まで管理して
ロック待ち、ロック開放、イベントシグナル変更、シグナル待ち まで提供しとけば手っ取り早くできなくはない
ただしマルチスレッドプログラミングの注意点をLuaでも守らなきゃならなくなる
最後は>>9の手段についてだけど、これが無難と言えば無難だけど、
通知を待つ手段をコルーチンの類にすると、ちょいと突っ込んだ事を始めるとすぐに限界にぶちあたる筈
どうせ読み込みを開始して必要な処理が終わったらコルーチンか終了フラグをポーリングするんだろうから
いっその事ブロッキングしちゃった方がいいんじゃないかと思わなくもない
この時の注意点はホストからの終了要求も取りこぼさない様に2つ(複数)のハンドルをウェイトする事 Luaに足りない機能が欲しいときはJavaScriptを参考にするといい
この2つはスクリプトエンジン部分が非常によく似ている
非同期処理が欲しいなら、Promiseのように処理完了でコールバックする形式が良い
実装は、非同期I/Oなりスレッドプールなりでご自由に
また、Lua自体を並列実行したい場合は Web Worker が参考になる
新しいStateで独立したグローバル環境を用意し、引数/返値のみマーシャリングする
ホスト側のマルチスレッドを公開する >>11 の方法は間違いで、GCが破綻する