• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:明示的なオブジェクトの削除)

Perlでthreadを削除する方法

mosuradazoの回答

回答No.4

メモリ変数がガーベージコレクションの対象に ならないと言ううことは、参照カウンターが 0にならないことを意味します。 func関数の中でmainの名前空間を使用していないかどうか 確認してもらえますか。 問題ないようでしたら、 threadsモジュールに DESTROY処理を追加してオブジェクトがきちんと破棄されているかどうか確認してはどうでしょうか。 それから前の私の発言に誤りがありました 下記の通り配列の要素数になることを確認しました。 すみません。 @a=(1,2,3,4); $cnt=@a; printf("%d\n", $cnt); 4

miriorg
質問者

補足

「func関数の中でmainの名前空間を使用していないかどうか」というのはfunc呼び出し側(or親スレッド)内の変数や関数を使って呼び出していないか...ということでしょうか?(関数は呼び出しています) そのほかに、以下のように定義した共有変数をlockを使ってアクセスしあっています。 my $signal : shared = 0; >threadsモジュールにDESTROY処理を追加して DESTOROYはC++言語で言う所のデストラクタなんですね。 threadモジュールにコードを追記する...って事ですか? そゆ事ってやっちまっても良いものなんですか? ちょっとperlの文化を理解するほど深くいじっていないもので...。

関連するQ&A

  • IO-Socketで…

    最初に開かれた1つのソケットで、 サーバーから不定期に送られてくるデータを処理→表示しつつ、 ユーザーから入力があった場合にそのソケットへ送信するといったメッセンジャーを作ろうと思っているのですが、「入力待ちと受信待ちを同時に進める」という事がどうも上手くいってくれません… use threads;を使い、送信用・受信用と分けたのですが、やはりどちらか一方が止まってしまいます…。 どの様に書いたらよいのでしょうか… 何方かご教授下さい…。 use threads; use IO::Socket; ($test_socketを生成) sub send{ while($input = <STDIN>){ chomp($input); print $test_socket "$input"; } sub recv{ while(1){ if($receive = <$test_socket>){ print "$receive\n"; } } } my $sendthread = threads->new(\&send); $sendthread->join(); my $recvthread = threads->new(\&recv); $recvthread->join();

  • pThreadのメインでなぜsleep?

    Windowsとlinux環境で、pthreadをもちいて、動作確認などをしています。 こちらのサンプルを下に、じっけんしていたのですが。 http://www.ibm.com/developerworks/jp/linux/library/l-posix3/ ここのメインのコードに, sleep(2) という表記があります。 なぜここでsleepをしなければいけないんでしょうか? 実際に、削除してみると、スレッドの作業が途中で終了してしまいました。 このやり方だと、作業時間がわかっている場合は、いいのですが、 もしどれぐらい処理にかかるかわからない場合、困ると思います。 どのようにすれば、sleepを使わずに作業が終わるのをまつことができるでしょうか? int main(void) { int x; wnode *mywork; initialize_structs(); /* CREATION */ if (create_threads()) { printf("Error starting threads... cleaning up.\n"); join_threads(); dabort(); } pthread_mutex_lock(&wq.control.mutex); for (x=0; x<16000; x++) { mywork=malloc(sizeof(wnode)); if (!mywork) { printf("ouch! can't malloc!\n"); break; } mywork->jobnum=x; queue_put(&wq.work,(node *) mywork); } pthread_mutex_unlock(&wq.control.mutex); pthread_cond_broadcast(&wq.control.cond); printf("sleeping...\n"); sleep(2); printf("deactivating work queue...\n"); control_deactivate(&wq.control); /* CLEANUP */ join_threads(); cleanup_structs(); }

  • KENTさんの掲示板のワード検索について

    http://www.supra.cx/joyful2chMe/index.html こちらのjoyful2ch.cgiの1071行目からのワード検索で、 検索対象を親記事のみにしたいのですが、どうすればよいでしょうか。 ログの中の$reno=""が親記事のようなのですが・・ # ファイルを読み込み @new=(); open(IN,"$logfile") || &error("Open Error : $logfile"); $top = <IN>; while (<IN>) { $flag=0; foreach $pair (@pairs) { if (index($_,$pair) >= 0) { $flag=1; if ($in{'cond'} eq 'OR') { last; } } else { if ($in{'cond'} eq 'AND') { $flag=0; last; } } } if ($flag) { push(@new,$_); } } close(IN); ここの辺りを書き換えるのでしょうか。

    • 締切済み
    • CGI
  • Java の配列の中身は volatile ですか?

    たとえば(無理やりな例ですが)、クラスが private final boolean isReady[] = {false, false}; public void setIsReady(int index, boolean isReady) {  this.isReady[index] = isReady; } public void doTask(int index) throws Exception {  while (! isReady[index] ) {   Thread.sleep(1000);  }  doSomething(); } のようなメンバとメソッドを持っていて、setIsReady() と doTask() がそれぞれ別のスレッドから呼ばれるような場合、doTask() の中の while ループはちゃんと抜け出す事が保証されますか? (もちろん isReady[index] を true にセットするとして。) isReady が配列ではなければ private volatile boolean isReady = false; としておけば安心できるのですが、配列の中身を明示的に volatile に宣言 出来ないようなので。(出来るのならばやり方を教えてください。)

  • threads を使ったマルチスレッドのエラー

    threads のモジュールを使ってマルチスレッドのテストをすると下のようなエラーが 発生します。 何が原因なんでしょうか? Usage: threads->create(function, ...) at C:\testPerl\test9\test0006.pl line 11. use strict; use threads; use Data::Dumper; no strict "refs"; my $countM; for ($countM = 0; $countM < 5; $countM++){ my $test = "test".$countM; ${"thd".$countM}= threads->new(\&mtest($test)); ${"thd".$countM}->join; } print "test end.\n"; sub mtest { my $name = @_; print "$name"."\n"; threads->yield(); }

  • C++におけるスレッド制御に関して

    C++初心者です。 スレッド制御の勉強をしておりますが、 なかなかうまくいきません。 下記のソースのようにスレッド生成をしておりますが、 スレッド用メソッドには、*を付けて使用するしか方法はないのでしょうか? pthread_createに渡す第3パラメータをメソッド名のみにして、呼ばれ元のメソッドの戻り値をvoid* ではなく、void のみで実施したいと思っておりますが、方法がわかりません。 大変申し訳ございませんが、ご教授よろしくお願いいたします。 ############################################################## # pthread_test.cc ############################################################## #include <stdio.h> #include <pthread.h> #include <stdlib.h> #include <unistd.h> /* * スレッドパラメータ格納用 */ typedef struct {  char printVal;  int interval; } ThreadParamT; // スレッドイニシャル関数 void *ThreadTest(void *arg) {  ThreadParamT *thread_test_param =(ThreadParamT*)arg;  while(1) {   fprintf(stderr,"%c", thread_test_param->printVal);   sleep(thread_test_param->interval);  }  return NULL; } int main(int argc,char *argv[]) {  int status;  // スレッドのパラメータ  pthread_t thread_test;  ThreadParamT thread_test_param;  thread_test_param.printVal = 'a';  thread_test_param.interval = 1;  // スレッドを生成  status=pthread_create(&thread_test, NULL, ThreadTest, &thread_test_param);  if(status!=0){   fprintf(stderr,"ERR! OUT!\n");   exit(1);  }  // 10s間待つ  sleep(10);  fprintf(stderr, "\n");  return 0; } ##############################################################

  • boost::threadでのjoinについて

    スレッド用に作成したループ用関数を自前で終了させてからjoinをすると、thread::m_joinableがfalseになりjoinでassertが出ることがあります。 問題の処理を簡単なモデルで説明しますと、 bool g_finish(false); void thread_loop(void) {  while(true)  {   ...   if(g_finish) break;  } } int main(void) {  boost::thread th(thread_loop);  sleep(100000);  g_finish=true;  th.join(); // assert  return 0; } といった感じになります。実際にはスレッド管理クラスにおいて複数のス レッドが管理されています。 冗長ですが、このような処理をするときにjoinのときにm_joinableがfalse になりassertが出るという事態です。 どなたが知識をお持ちの方がおられましたらご教授願えれば幸いです。

  • hashCode

    ObjectのhashCodeはどういう規則で生成されているのでしょうか? あるオブジェクトにおいて、オブジェクトの生成順番が実行毎に同じならばhashCodeは同一になるかと思っていたのですが、どうも違うようなので気になりました。 例えば、マルチスレッドでObjectの生成順序を毎回違うよう生成しても、ob配列ojbs1,objs2中の要素のhashCode()は同じになります。 public class HashCodeMultiThreadTest {  public static void main(String[] args) {   final Object[] objs1 = new Object[20];   final Object[] objs2 = new Object[20];   int one_or_two = (int) (Math.random()*2+1);   final long sleep_time1 = 100 * one_or_two;   final long sleep_time2 = 100 * (3-one_or_two);      Thread t1 = new Thread() {    public void run() { try{     for (int i=0; i<objs1.length; i++) {      objs1[i] = new Object();      Thread.sleep(sleep_time1);     }    }catch(Exception e){}}   };   Thread t2 = new Thread() {    public void run() { try {     for (int i=0; i<objs2.length; i++) {      objs2[i] = new Object();      Thread.sleep(sleep_time2);     }    }catch(Exception e){}}   };   try {    t1.start();    t2.start();    t1.join();    t2.join();   }catch(Exception e){}   for (Object o : objs2)    System.out.println(o.hashCode());  } }

    • ベストアンサー
    • Java
  • Thread のターゲット切り替えについて

    以下のようなソースを書きました。Runnableを実装しているクラスをスーパークラスに持つクラスThreadSampleChildをインスタンス化した後にそのクラスのThreadを実行し、途中で親クラスのスレッドに切り替えることを目的としているのですが、切り替わらずに子クラスのThreadが引き続き継続してしまいます。 理由はなんとなくわかるのですが。子クラスから親クラスのThreadを実行させるためにはどう工夫すればよいのでしょうか? class ThreadSample implements Runnable { Thread threadp; ThreadSample() { } public void run() { while(true) { try { System.out.println("Parent"); Thread.sleep(500); } catch(Exception e) { break; } } } public void makingThreadParent() { threadp = new Thread(this); } } class ThreadSampleChild extends ThreadSample { Thread threadc; ThreadSampleChild() { } public void run() { while(true) { try { System.out.println("Child"); Thread.sleep(500); } catch(Exception e) { break; } } } public void makingThreadChild() { threadc = new Thread(this); } public void exe() { while(true) { threadc.start(); try { Thread.sleep(10000); } catch(Exception e) { } threadc.interrupt(); makingThreadParent(); System.out.println("Thread Change !!!!"); threadp.start(); try { Thread.sleep(10000); } catch(Exception e) { } threadp.interrupt(); } } public static void main(String args[]) { ThreadSampleChild tsc = new ThreadSampleChild(); tsc.makingThreadChild(); tsc.exe(); } }

    • ベストアンサー
    • Java
  • condition_variable::wait~

    こんばんわ。タイトルに入りきらないので省略してしまいました。 condition_variable::wait_forについて質問です。 windows用のスレッドをstd::threadに置き換えてみようと思いまして、 以下のようなプログラムを書いてみました。 ---------------------------------------------------------- #include <thread> #include <mutex> #include <memory> #include <windows.h> // Sleep 用。 class CFoo { protected : struct _THREADPARAM { std::condition_variable m_cond_var_ExitQuery ; } ; // struct _THREADPARAM public : CFoo( void ){} virtual ~CFoo() { this->exitThread() ; } void Wakeup( void ) { m_lpoThread.reset( new std::thread( fnThread, std::ref( m_mutex ), &m_sThreadParam )) ; } protected : void exitThread( void ) { puts( "スレッドの終了処理をします。" ) ; m_sThreadParam.m_cond_var_ExitQuery.notify_one() ; m_lpoThread->join() ; m_lpoThread.reset() ; puts( "スレッドが終了しました。" ) ; } static int __stdcall fnThread( std::mutex& _mutex, _THREADPARAM* const lpsThreadParam ) { std::unique_lock< std::mutex > lk( _mutex ) ; std::cv_status result ; puts( "スレッドを開始します。" ) ; while( true ) { result = lpsThreadParam->m_cond_var_ExitQuery.wait_for( lk, std::chrono::seconds( 1 )) ; if( result == std::cv_status::no_timeout ) { puts( "ループを抜けます。" ) ; break ; } puts( "ループ中。" ) ; } puts( "スレッドを終了します。" ) ; return 0 ; } protected : std::mutex m_mutex ; std::shared_ptr< std::thread > m_lpoThread ; _THREADPARAM m_sThreadParam ; } ; // CFoo int main() { CFoo* foo ; foo = new CFoo() ; foo->Wakeup() ; ::Sleep( 100000 ) ; delete foo ; return 0 ; } ---------------------------------------------------------- 上記のプログラムを走らせると、「ループ中。」がずっと表示されなければならないのですが、何かのタイミングでループを抜けてしまいます。 if( result == std::cv_status::no_timeout )が真になってしまいます。 何か設定が足りないのでしょうか? ご存じの方がいらっしゃいましたら教えていただけないでしょうか。 よろしくお願いします。