1

次のコードを検討してください。

for (my $i = 0; $i < $threadCount; $i++) {

    if($isResumed) {

        # TODO: load stats from DB      
    }
    else {

        $stats->{workers}->{$i}        = &share({});            
        $stats->{workers}->{$i}->{tid} = undef; 
        $stats->{workers}->{$i}->{foo} = "bar";
        $stats->{workers}->{$i}->{abc} = 123;                               
    }

    # create the worker thread
    my $thr = threads->create(\&worker);    
    # TODO: find a way to store the TID in the $i slot. why have two differetn IDs? 
    $stats->{workers}->{$i}->{tid} = $thr->tid();
}

$stats ハッシュを使用して、スレッド間で共有する必要があるデータと、各スレッドの実行内容に関するデータを保持しています。私が抱えている問題は、ループ内で $i によって割り当てられた任意の値ではなく、TID に基づいてこのハッシュのスレッド データを参照したいということです。

スレッドを作成するとすぐに作業が開始されますが、ハッシュ値が設定されるまで作業を開始できません。だから、もしそうなら:

$thr = threads->create(\&worker);
$stats->{workers}->{$thr->tid()} = &share({});

必要なすべてのデータがまだ設定されていないため、機能しません。

基本的に、スレッドを作成する方法はありますが、具体的に指示するまでコードの実行を延期しますか? 何かのようなもの:

$thr = threads->create(\&worker);
$stats->{workers}->{$thr->tid()} = &share({});
$thr->start();
4

2 に答える 2

4

このようなものにはThread::Queueを使用することを強くお勧めします

于 2012-10-11T17:58:52.370 に答える
0

最後に、私のコードを確認した後、私はそれを複雑にしすぎていることに気づき、TIDを本当に知る必要はありませんでした。

結局、createステートメントの間に関連データをworkerサブルーチンに渡すだけでした。

そうは言っても、この質問に出くわした人は、私の元の問題に対する有望な解決策であるように見えるので、Jeanの答えを見てください。

于 2012-10-15T19:42:39.667 に答える