如何在没有立即运行的情况下创建线程?

时间:2012-10-11 17:45:48

标签: multithreading perl

请考虑以下代码:

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();

2 个答案:

答案 0 :(得分:4)

强烈建议您使用Thread::Queue这样的内容

答案 1 :(得分:0)

最后,在审查我的代码之后;我意识到我让它变得复杂,并且真的不需要知道TID。

我最终只是在create语句中将相关数据传递给worker子例程。

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