threads 线程 handles can't be shared between threads and

threads 线程 handles can't be shared between threads and

这个贴子(http://bbs.chinaunix.net/thread-1351797-1-1.html)可能是require引起的,所以我想把代码写在一个文件里试试,又出了新的错。郁闷



    1  #!/usr/bin/perl

     2  #

     3  #load

     4  use DBI;
     5  use strict;
     6  use warnings;
     7  #use diagnostics;

     8  use URI;
     9  use threads;
    10
    11  require("qeesoo_prehandle.conf");
    12  our $log;
    13  our $dbh_gdas;
    14
    15  my $thr1= threads->new(\&load_t_media_info);
    16
    17  sub load_t_media_info(){
    18
    19          my $sql="select a.`id`media_id ,a.`media_name`,a.`shortname` from `t_media_info_new` a ";
    20          $log->info(" $sql ");
    21
    22          # execute SELECT query

    23          my $sth = $dbh_gdas->prepare("$sql");
    24          $sth->execute();
    25
    26          my @t_media_info;
    27          my @t_media_info_list;
    28          my $i;
    29
    30          while (my $hash_ref = $sth->fetchrow_hashref) {
    31          my $media_id    =       $hash_ref->{'media_id'};
    32          my $media_name     =       $hash_ref->{'media_name'};
    33          my $shortname    =       $hash_ref->{'shortname'};
    34
    35          #将所有数据存入二维数组

    36          @t_media_info = ($media_id,$media_name,$shortname);
    37          $log->debug("\@t_media_info\-\-$media_id,$media_name,$shortname");
    38          $t_media_info_list[$i++] = [@t_media_info];
    39          }
    40
    41          $log->info("done get t_media_info");
    42          # clean up

    43          $dbh_gdas->disconnect();
    44  }
    45  $thr1->join;
    46


执行后这个错,请问是什么原因造成的?
Thread 1 terminated abnormally: DBD::mysql::db prepare failed: handle 2 is owned by thread 9ecd008 not current thread a2485f0 (handles can't be shared between threads and your driver may need a CLONE method added) at prehandle line 23.

不能在线程里直接用$dbh_gdas

看看perldoc DBI
Threads and Thread Safety


QUOTE:
原帖由 ynchnluiti 于 2009-1-12 11:53 发表
不能在线程里直接用$dbh_gdas

看看perldoc DBI
Threads and Thread Safety

看到了。谢谢。

看来还得接着找方法。加油。

你们经常会用多线程模块嘛。



QUOTE:
原帖由 枫影谁用了 于 2009-1-12 11:56 发表
你们经常会用多线程模块嘛。

我不常用


QUOTE:
原帖由 枫影谁用了 于 2009-1-12 11:56 发表

看到了。谢谢。

看来还得接着找方法。加油。

你们经常会用多线程模块嘛。

用多进程吧,简单多了,而且许多时候也够用了。


QUOTE:
原帖由 MMMIX 于 2009-1-12 13:48 发表

用多进程吧,简单多了,而且许多时候也够用了。

恩,我再看看资料。

需在实现这样的:

运算的时候多数据源同步运算,

需要定时重启或是刷新线程。
不考虑效率的方法,每个线程里面现创建数据库连接