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 哈希来保存应该在线程之间共享的数据,以及有关每个线程正在做什么的数据。我遇到的问题是我想根据 TID 引用此哈希中的线程数据,而不是循环中 $i 分配的任意值。

当我创建线程时,工作立即开始,但在设置哈希值之前它无法开始工作。所以,如果我这样做:

$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。

我最终只是在创建语句期间将相关数据传递给工作子例程。

尽管如此,遇到这个问题的人应该看看让的答案,因为它似乎是我原来问题的一个有希望的解决方案。

于 2012-10-15T19:42:39.667 回答