以下の様なコードを用いてthreadを走らせています。
my $cond = 0;
while($cond == 0){
{
my $thread;
my @threads;
my $index = 0;
while ($index < @param1){
$thread = threads->new(\&func, $param1[$index++], $param2);
push @threads, $thread;
}
sleep(1);
while (@threads > 0){
$thread = pop @threads;
$thread->join();
}
}
condcheck();
}
条件が満たされるまで、一定の処理を行うthreadを複数走らせるというものなのですが、
これを実行すると、perlの使用しているメモリがどんどん増えて行っているのを確認しました。
#@threadsや$threadのスコープが外れるようにしているのになぜ?
newしたthreadオブジェクトを、明示的に削除したいのですが、どのようにすればよいでしょうか?
No.5ベストアンサー
- 回答日時:
参照カウンターは、メモリー実体とperlの変数とを
結び付けているリンクの数と考えてください。
perlの変数がスコープから外れて削除されると。
メモリー実体の参照カウンターが一つ減ります。
そしてカウンターが0になればメモリー実態が削除されます。
この処理を行っているのがガーベージコレクションです。
メモリー実体を削除するときガーベージコレクションは、
DESTROY関数の定義があれば実行します。
パッケージは普通DESTROY関数を定義しません、
なぜならものすごく遅くなるからです。
今回のようにメモリが削除されているかどうかを確かめる
ためにパッケージにDESTROY関数を追加するのもよいかも
しれません。
パッケージを修正するのに抵抗があるのならカレントディリクトリに threads.pm をコピーし
perl -I . test.pl のように実行してみてはいかがでしょうか。
No.4
- 回答日時:
メモリ変数がガーベージコレクションの対象に
ならないと言ううことは、参照カウンターが
0にならないことを意味します。
func関数の中でmainの名前空間を使用していないかどうか
確認してもらえますか。
問題ないようでしたら、 threadsモジュールに
DESTROY処理を追加してオブジェクトがきちんと破棄されているかどうか確認してはどうでしょうか。
それから前の私の発言に誤りがありました
下記の通り配列の要素数になることを確認しました。
すみません。
@a=(1,2,3,4);
$cnt=@a;
printf("%d\n", $cnt);
4
この回答への補足
「func関数の中でmainの名前空間を使用していないかどうか」というのはfunc呼び出し側(or親スレッド)内の変数や関数を使って呼び出していないか...ということでしょうか?(関数は呼び出しています)
そのほかに、以下のように定義した共有変数をlockを使ってアクセスしあっています。
my $signal : shared = 0;
>threadsモジュールにDESTROY処理を追加して
DESTOROYはC++言語で言う所のデストラクタなんですね。
threadモジュールにコードを追記する...って事ですか?
そゆ事ってやっちまっても良いものなんですか?
ちょっとperlの文化を理解するほど深くいじっていないもので...。
No.2
- 回答日時:
#1 の方へ:
配列変数をスカラーコンテキストで評価するとその配列の要素数になります.
だから
while ($index < $#param1) {
でも
while ($index < @param1) {
でも同じことではあります. まあ前者の方が誤解される可能性は少ないと思いますが.
それはさておき, perl の使っているメモリが増えているのはどのように確認したのでしょうか?
プログラムによってはメモリが不要になってもシステム (OS) に返さないことがあります.
手のあいているときに garbage collector を走らせればいいはずなんですが, perl で
明示的に garbage collector を走らせることってできたっけ....
この回答への補足
Cygwin on Windows XPでいろいろ試していますが、
perl の使っているメモリが増えているのは
perfmonをって、該当するperl processのworking setをモニタリングして確認しました。
perl はほとんど使い始めたばかりなので、何をするにも入門書&googleが手放せないのですが、
@param1の評価方法は "perl 配列 要素数"とかでググッた結果で出てくるページに載っていたもののはずです。
一応、{}を使って、配列(@threads)と変数($thread)の寿命を切ってみたつもりだったのですが、効果がなかったので泣けてます...。
thread関数内ではgcは効かないのでしょうか...。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- iPhone(アイフォーン) iPhoneのデータ処理の仕組みに詳しい方に質問です。下の知恵袋とAppleコミュニティで、「ボイス 2 2022/07/16 00:04
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
- その他(SNS・コミュニケーションサービス) TwitterとThreadsについて。 闘病アカウントを始めようと思っているのですが、 Twitt 5 2023/07/27 22:51
- その他(SNS・コミュニケーションサービス) なぜ教えてgooにはThreadsの質問がこんなにもないのでしょうか。 2 2023/07/07 11:19
- Visual Basic(VBA) Vbaで数式をポーランド記法に変換するコードを作って実行しようとするとフリーズします。 1 2022/05/24 17:53
- Instagram 「threads」というアプリで分からないことがあるので教えてください。 私はインスタのアカウントを 2 2023/08/05 17:28
- その他(SNS・コミュニケーションサービス) Instagram版Twitter 1 2023/07/04 18:21
- Instagram 皆さんはThreads使っていますか? 1 2023/07/09 07:30
- ビデオカード・サウンドカード HP 6300でRX 550は使えますか? 1 2023/01/20 16:33
- Visual Basic(VBA) RemoveDuplicatesメソッドについて教えてください。 シート1にシート2から値をもってく 1 2023/02/28 22:43
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
テキストファイルで提出とは?
-
ターミナルで特定の文字と文字...
-
Perlでの文字列置換
-
#!/usr/bin/perlで書きだしたCG...
-
Perlのエラーについてご教授く...
-
perlのflock関数でロックをかけ...
-
ファイルアイコンの左下に緑の□...
-
perlプログラミング 空白行削除
-
perlのrequireの動き方について...
-
ペプシコーラとコカ・コーラとD...
-
perlについての質問
-
perl このテキストファイルを簡...
-
Perlでファイルの末尾から指定...
-
Perlで特定文字列から特定文字...
-
Perlのプログラムについて
-
CGIでimgタグでalignを使うとエ...
-
openした後、closeしないでプロ...
-
perl 初等プログラミングについて
-
Windows版のPerlについて
-
このファイルを開く方法で困っ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Can't use string ("0") as an ...
-
PerlでCSV形式のファイルの一部...
-
perlの引数が不安定になります。
-
perlの比較、ループの使い方に...
-
レキシカル変数について
-
画面を強制的に再描画させる方法
-
VBAでの一時停止と再開の方法
-
データベースでユーザーのパス...
-
VBのReturnの使い方
-
ループ7回目の悪役令嬢は、元敵...
-
UWSCの終了の仕方
-
Escキーを押すと、中断する時と...
-
エクセルの当番表を作っていま...
-
GIFアニメをループさせたくない
-
VBAで3秒だけ時間を止めたい
-
どなたかこのプログラミングを...
-
VBA for i=1 to lastrow
-
文字列を変数名として扱う方法
-
ハッシュ検索はなぜ速い
-
DOSコマンドのループ内のTIMEコ...
おすすめ情報