HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2009
1016
domo[hsp3imp]hspini(),hspexec()を複数のスレッドから呼び出して安全か?5解決


domo

リンク

2009/10/16(Fri) 19:52:07|NO.28322

hspini(),hspexec()を複数のスレッドから呼び出して安全でしょうか?
hspini()でHSPタスクの実行に必要なインスタンスが初期化されるとあります。
hsp3impはシングルタスクでの実行を前提としているので、
複数のスレッドからhspini()を呼び出した場合、
同一のインスタンスが何度も初期化されるのではないかと心配です。

またhspexec()はスクリプトが動いている限り、HSPタスクの実行に専念するようです。
hspexec()で無限ループなスクリプトを書いてしまった場合、
その後のhspbye()は実行されません。

ウィンドウを閉じ、プロセスを終了した際にDLLがプロセスからデタッチされます。
その際、hsp3impは使用していたリソースを解放すると思いますが、
複数のスレッドでhspini(),hspexec()を使っていた場合でも、
きちんとリソースが解放されるのでしょうか。

早い話が、hspini()やhspexec()を複数のスレッドで何度も呼び出してしまっていいのかどうか。
そしてhspbye()が実行されずにhsp3impがプロセスからデタッチされるときに
使用していたリソースを全て解放しているのかどうか。

そもそもそんなこと気にせずともWindowsがプロセス終了時には
使用していたリソースを全て解放してくれるのかどうか、です。



この記事に返信する


おにたま(管理人)

リンク

2009/10/16(Fri) 20:21:23|NO.28323

hsp3imp.dllはスレッドセーフではありません。
HSPのインスタンスを複数持つ場合は、hsp3imp.dllを複数タスクとして
初期化さたものを持つ必要があります。

>hspexec()で無限ループなスクリプトを書いてしまった場合、
>その後のhspbye()は実行されません。

hspexec()を実行しても、親のウインドゥプロシージャーにはメッセージが
送られてきますので、もしその時点で強制的にHSPの実行を終了させたい場合は、
hspctx->runmodeに、RUNMODE_ENDの値を入れてください。
すぐにhspexec()から戻ります。

>そしてhspbye()が実行されずにhsp3impがプロセスからデタッチされるときに
>使用していたリソースを全て解放しているのかどうか。

hspbye()が実行されなかったとしても、dllをデタッチした時点で
確保されたリソースはすべて解放されます。

>そもそもそんなこと気にせずともWindowsがプロセス終了時には
>使用していたリソースを全て解放してくれるのかどうか、です。

行なわれます。



domo

リンク

2009/10/16(Fri) 22:52:19|NO.28329

おにたま様ありがとうございます。

子スレッドでHSPタスクを動作させるブリッジプラグインを作ろうとDLLの設計中で、
すでにHSPThread.dllなるものが存在していて、
単純にスレッド関数の中でhspexec()->hspbye()とやっても
スレッドの始末ができないだろうと思い、
hsp3impとマルチスレッドとの相性や、リソースの後始末、安全性について疑問を抱いたので
聞いてみました。

聞いたかいあって、大変参考になりました。
HSPThread.dllへのヒントにもなってしまったかも知れないと、
少々後悔しておりますが。



domo

リンク

2009/10/17(Sat) 07:31:53|NO.28330

再びお聞きしたいのですが、
>HSPのインスタンスを複数持つ場合は、hsp3imp.dllを複数タスクとして
>初期化さたものを持つ必要があります。
このことは、プロセスにアタッチされたhsp3impは
HSPタスクとして一意のインスタンスを管理している
ということでしょうか。

具体的には

hspini(); hspexec(); hspbye();
のような呼び出しであればhspbye()はタスク実行にかかったリソースを安全に処理できますが、

hspini(); hspexec(); hspini(); hspexec(); hspbye();
のような呼び出しでは、最初のタスク実行にかかったリソースは最後のhspbye()では処理されない、
ということかどうか。

OpenHSPにhsp3impのソースがないので、このようなまどろっこしい質問になって申し訳ありません。



おにたま(管理人)

リンク

2009/10/17(Sat) 09:49:22|NO.28332

hsp3impのタスクは、

hspini();
hspexec();
hspbye();

で1セットです。hspbyeを入れずにhspiniを行なった場合は、メモリリークします。
hsp3impは、HSP3のメイン実行部分(hsp3win.cpp)を3つのパートに分けてdll化しているに過ぎません。
1つのプロセスにアタッチされるhsp3impが管理できるインスタンスは1つだけです。



domo

リンク

2009/10/17(Sat) 21:54:23|NO.28348

おにたま様ありがとうございます。
一番ききたかったことが聞けて感謝です。
全ての疑問が解決いたしました。そしてHSPThread.dllは内部でメモリリークを起こしていることも把握できました。
本当に感謝です。
これで私が今作ろうとしているものが無駄ではないことがわかりました。

本当にありがとうございます。



ONION software Copyright 1997-2023(c) All rights reserved.